我有一个处理立方体(3D 图像,准确地说是光谱立方体)的 GPU/CUDA 代码。把立方体想象成一系列图像/切片,或者,一堆具有不同空间位置(在正方形上)的光谱。图像的每个像素具有不同的 x、y 值和相同的 z。光谱上的每个像素具有相同的 x,y 但不同的 z。多维数据集的内存以某种方式对齐,以便两个连续的内存地址对应于 x 和 x+1。
在我的 CUDA 代码中,我将每个 CUDA 线程配置为处理不同的频谱。这样我就可以实现全局内存合并。然后我将此代码移植到 Intel Phi (#pragma offload+OpenMP)。就像在 GPU 的情况下,我有每个 Phi 核心来处理不同的频谱。因此,这里也实现了内存合并。但是,性能很差。
- 我认为问题在于,尽管我与全局内存合并,但每个光谱中的像素不在连续的内存地址上,因此,Phi 的矢量化并没有提供任何性能改进。(请记住,每个核心都会在相关频谱上进行某种缩减;更准确地说,它会计算一阶、二阶和三阶矩)。这个想法有意义吗?
- 如果我没记错的话,为了从 SIMD 中获得性能,你的内存地址必须是连续的,对吧?
- 因此,在 Xeon phi 上似乎不可能实现完美的内存合并全局内存并同时充分利用 SIMD。这是有道理的还是我完全错了?
PS:我使用的是英特尔至强融核 7120