我有一个名为Grid的类,其中包含一个我想向量化的方法,称为countNeighbors。
在主程序内部,我定义并定义了Grid类及其所有组件,正确地将countNeighbors方法的代码向量化:使用元素函数表示法。
主要功能包含一个循环,该循环在每一步都调用countNeighbors方法,该方法使用数组表示法正确地矢量化了。
我编译如下:
icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -o main main.cpp
编译时,循环已正确向量化。
相反,如果我将Grid类的代码移动到两个不同的文件:Grid.hpp和Grid.cpp中,则在编译时会得到:
在Grid.o中countNeighbors函数已正确向量化
基本上,该循环未向量化,报告以下诊断:
LOOP BEGIN at main.cpp(48,52)
remark #15382: vectorization support: call to function Grid::countNeighbors(const Grid *, size_t, int) const cannot be vectorized [ main.cpp(48,31) ]
remark #15344: loop was not vectorized: vector dependence prevents vectorization
LOOP END
我尝试在主循环上方添加#pragma ivdep或#pragma vector always指令,并且尝试添加选项-ipo,但结果保持不变。
为了使代码矢量化,该怎么办?
解决了:
真的很抱歉,我只是意识到我在创建目标文件时没有放置ipo标志。现在,按如下所示进行编译即可获得正确的结果:
icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -ipo -I . -c grid.cpp grid.hpp -o grid.o
icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -ipo -I . -o main main.cpp grid.o
最佳答案
如果我正确地推断出您还没有说的话,那么您就有了一个循环,其中包含对琐碎函数的调用。当该琐碎的函数定义可用时(在同一编译单元中),将内联该函数,并内联该函数,从而对循环进行矢量化。但是,当函数定义不在同一编译单元中时,就不会矢量化。
所有这些都应该是您所期望的。因此,将定义放在Grid.hpp中而不是Grid.cpp中-ipo
可能不需要在同一编译单元中具有定义。但这对您不起作用(对我而言从来没有做过),因此依靠它似乎并不明智。