【发布时间】:2013-01-29 05:56:34
【问题描述】:
我正在尝试编写一些可以向量化的 C 代码。这是我正在尝试的循环:
for(jj=0;jj<params.nx;jj++)
for(kk=0;kk<NSPEEDS;kk++)
local_density_vec[jj] += tmp_cells_chunk[jj].speeds[kk];
当使用-ftree-vectorizer-verbose=5 标志http://pastebin.com/RfCc04aS 运行时,GCC 会给我以下消息。
我怎样才能重写它以便它可以自动矢量化。 NSPEEDS 是 5。
编辑:
我一直在努力,我似乎无法使用.speeds[kk] 对任何东西进行矢量化处理。有没有办法对其进行重组以使其可以?
【问题讨论】:
-
编译器无法对其进行矢量化处理,因为它无法确定数组之间是否存在别名。此外,您的
NSPEEDS行程计数太小,无法从矢量化中获得任何加速。 -
在我的第一次尝试中,我交换了循环。我希望它用
NSPEEDS展开外观并矢量化另一个循环。任何带有.speeds[kk]的循环都无法矢量化。我可以改变这个吗? -
在这种情况下别名是什么意思?
-
别名意味着编译器不知道你的数组是否重叠。矢量化通常会改变访问内存的顺序。编译器不能合法地向量化,除非它可以证明它不会违反任何依赖关系。
-
简而言之,无论您如何订购,您的代码都无法矢量化。向量化通常只适用于顺序和连续的内存访问。无论您如何订购循环,这里都不是这种情况。问题是
tmp_cells_chunk似乎是一个结构。这意味着您有array-of-structs 包装。如果要矢量化,可能必须切换到 struct-of-arrays 内存布局。
标签: c gcc vectorization