案例研究: 针对计算密集型循环对比结构数组和数组结构的数据布局

by Paul Besl

下载 PDF 格式的完整案例研究下载

下载随附的源代码(ZIP 格式)下载

 

摘要

一位客户最近购买了大量的英特尔® 至强融核™ 协处理器,旨在帮助其基于英特尔® 至强™ E5-2600 系列处理器的 16 核双路计算节点集群提高性能(每路 8 个内核)。 61 内核的英特尔至强融核协处理器经过编程之后,可以作为单独的 Linux* 主机或通过由英特尔至强处理器主机控制的卸载方法在本地执行。 在本案例研究中,我们使用一个迷你应用代码测试主机版本、试验英特尔至强融核协处理器本地执行、优化本机版本(同时还有主机版本),采用的方法是将两个包含三维点数据的 AoS 数组(“结构数组”)转换为 SoA 格式(“数组结构”)。 我们还通过添加“卸载编译指令”卸载关键的 O(N2) 循环,确保本机版本在卸载版本中可以保持几乎全部的性能。 此外,我们在两个主循环上使用了高速缓存封闭转换,采用的方法是创建 4 个循环,然后交换两个中间(非内,非外)循环。 最后我们对所有经过测试的英特尔至强和英特尔至强融核协处理器版本进行对比,发现最慢的 AoS 双精度可执行代码与最快的 SoA 单精度可执行代码间的性能比达到了 9:1。

简介

一位客户最近购买了大量的英特尔至强融核协处理器,旨在为其基于英特尔至强 E5-2600 系列处理器的 16 核双路计算节点集群提高性能(每路 8 个内核)。 它们可以支持这些系统上的各种软件包。 它们在之前的 x86_64 集群上已经可以运行配备同一套受支持软件包的集群。 英特尔已经开发的软件技术包括英特尔® 编译器、英特尔® 数学核心函数库(英特尔® MKL)、英特尔® MPI 库和英特尔性能分析工具,允许客户及其用户移植他们的软件,以便这些软件可以运行在本地的英特尔至强融核协处理器的 Linux* 操作系统上,就如同运行在单独的 Linux 主机上一样,或者将计算任务从主机卸载到位于 PCIe 主机总线上的英特尔至强融核协处理器。 这就表明,重要的计算服务器代码(即不是基于客户机的、面向 Windows* 的用户交互式代码)无需大量的软件工作就可以移植到英特尔至强融核协处理器上,或者为该处理器提供部分卸载支持。 然而,对软件开发人员来说,剩下的任务就是对他们的软件进行“调整和优化”,以便这些软件可以在协处理器上高效和快捷地运行。 借助“大内核”乱序 (OOO) 功能,英特尔至强处理器能够运行 x86_64、128 位 SSE(SIMD 流扩展)、128 位 AVX-1 或 256 位 AVX-1(英特尔® 高级矢量扩展)(英特尔®AVX)代码,而英特尔至强融核协处理器只能按顺序运行 x86_64 指令(包括 x87 指令)或新的 512 位英特尔® 初始众核指令(英特尔® IMCI)浮点矢量指令。 我们希望能为软件开发人员制定出一个决策树或按步执行的菜单,这样他们就能在移植或优化工作中花费最少的软件开发努力获得最出色的性能。

有关编译器优化的更完整信息,请参阅优化通知
标签: