0

VS2013 中的自动矢量化或自动并行器 (/Qpar) 引擎看不到函数模板。

例如,这段代码:

void foo::someFunc(int a)
{
    int myArray[1000000];

    for (unsigned i = 0; i < 1000000; i++)
    {
       myArray[i] = i+1;
    }
}

似乎已被识别,我从 /Qvec-report:2 和 /Qpar-report:2 获得了适当的输出:

foo.cpp

--- Analyzing function: void __cdecl foo::someFunc(int) __ptr64
c:\visual studio 2013\projects\autovectest\autovectest\foo.cpp(18) : info C5001: loop vectorized
c:\visual studio 2013\projects\autovectest\autovectest\foo.cpp(18) : info C5012: loop not parallelized due to reason '1007'
AutoVecTest.vcxproj -> c:\visual studio 2013\Projects\AutoVecTest\x64\Debug\AutoVecTest.dll

但是,一旦我someFunc()变成一个函数模板:

template <class T>
void foo::someFunc(T a)
{
    int myArray[1000000];

    for (unsigned i = 0; i < 1000000; i++)
    {
        myArray[i] = i+1;
    }
}

我从日志中的自动矢量化器或自动并行化器中一无所获:

foo.cpp
AutoVecTest.vcxproj -> c:\visual studio 2013\Projects\AutoVecTest\x64\Debug\AutoVecTest.dll

我没有使用 /GL,如Why would /Qvec-report:2 return nothing 中所述?(MSVC 2012)

4

1 回答 1

0
  1. 正如 Retired Ninja 指出的那样,确保您的函数模板实际被调用或实例化。

  2. 确保启用了正确的优化编译标志。YMMV 在这里,但Visual Studio 2012 的 Auto-Vectorization Cookbook/O2/O2 /GL将起作用。另一个用户发现/GL对他们不起作用(为什么 /Qvec-report:2 什么都不返回?(MSVC 2012))。使用#pragma("gt", on)为我启用了自动矢量化器。

于 2018-08-24T23:02:18.597 回答