关键词:
【中文标题】为啥 MSVC12 的自动矢量化器不分析函数模板?【英文标题】:Why would function templates not be analyzed by MSVC12's auto-vectorizer?为什么 MSVC12 的自动矢量化器不分析函数模板? 【发布时间】:2018-08-24 00:16:31 【问题描述】: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
我没有使用 Why would /Qvec-report:2 return nothing ? (MSVC 2012) 中所述的 /GL
【问题讨论】:
你真的在调用这个函数吗?1>--- Analyzing function: void __cdecl someFunc<int>(int) 1>c:\temp\test\test.cpp(321) : info C5001: loop vectorized 1>c:\temp\test\test.cpp(321) : info C5012: loop not parallelized due to reason '1007'
我想我不在我的示例代码中。但我与我的现实生活中的代码。让我调整我的示例代码并报告回来
使用我的示例代码成功!如果我调用模板化函数(即int a; someFunc(a);
或显式实例化函数(template void someFunc(int a)
),我会收到自动矢量化器/并行化器消息。
查看反汇编,我猜我的示例代码并不能准确反映我的实际代码问题。在我的示例代码中,如果我不调用 someFunc() 或显式实例化 someFunc(),则 someFunc() 不会出现在 obj 文件中(使用 dumpbin /disasm)。但是,在我的实际代码中,我的函数出现在 obj 文件中,因此至少正在创建模板函数。所以我不确定这是问题所在......
好的,我发现了示例代码和我的真实代码之间的差异。我的真实代码的头文件有一个从未关闭过的#pragma optimize("gt", on)
,因此它错误地自动矢量化了一些不应该的功能。一旦我在预期的功能之后添加了#pragma optimize("", on)
,自动矢量化器的行为就如其所愿。
【参考方案1】:
正如 Retired Ninja 指出的那样,确保您的函数模板被实际调用或实例化。
确保启用了正确的优化编译标志。 YMMV 在这里,但Visual Studio 2012's Auto-Vectorization Cookbook 说/O2
或/O2 /GL
会起作用。另一个用户发现 /GL
对他们不起作用 (Why would /Qvec-report:2 return nothing ? (MSVC 2012))。使用#pragma("gt", on)
为我启用了自动矢量化器。
【讨论】:
gcc、clang 和 msvc 的 C++ 自动矢量化要求
】gcc、clang和msvc的C++自动矢量化要求【英文标题】:C++auto-vectorizationrequirementsforgcc,clangandmsvc【发布时间】:2020-01-0811:37:27【问题描述】:下列说法正确吗?使用GCC和clang,如果我使用以下代码编译,我的代码将自动矢量化:-O2-ft... 查看详情
Lamba 取决于模板依赖值作为该模板的构造函数的默认值在 MSVC 上失败
】Lamba取决于模板依赖值作为该模板的构造函数的默认值在MSVC上失败【英文标题】:LambadependingontemplatedependingvalueasdefaultvalueofconstructorofthattemplatefailsonMSVC【发布时间】:2020-12-1114:25:37【问题描述】:我刚刚升级了我的msvc,遇到... 查看详情
MSVC:显式模板实例化失败,而隐式实例化成功
...】:我刚刚遇到了MSVC(版本12更新5)的问题:如果模板函数具有通过SFINAE禁用的重载,则显式实例化模板函数会失败。但是,调用该函数(从而隐式实例化它)是可行的。示例 查看详情
为啥 Pandas 应用可以比矢量化内置函数更快 [重复]
】为啥Pandas应用可以比矢量化内置函数更快[重复]【英文标题】:WhyPandasapplycanbefasterthanvectorizedbuilt-ins[duplicate]为什么Pandas应用可以比矢量化内置函数更快[重复]【发布时间】:2020-12-1515:46:40【问题描述】:我正在练习vectorizationwi... 查看详情
MSVC:隐式模板实例化,但未使用模板构造函数
】MSVC:隐式模板实例化,但未使用模板构造函数【英文标题】:MSVC:ImplicitTemplateInstantiation,thoughtemplatedconstructornotused【发布时间】:2010-08-0213:01:54【问题描述】:我正在尝试使用MSVC在Windows上编译Flusspferd,但由于模板实例化问题... 查看详情
C++17 函数模板中的静态数组初始化 (MSVC 2019)
】C++17函数模板中的静态数组初始化(MSVC2019)【英文标题】:StaticarrayinitializationinafunctiontemplateinC++17(MSVC2019)【发布时间】:2020-02-2214:46:45【问题描述】:我正在寻找一种方便有效的方法来初始化函数模板中的静态数组。例如,假... 查看详情
为啥捆绑器不使用系统宝石?
】为啥捆绑器不使用系统宝石?【英文标题】:Whybundlerdoesn\'tusesystemgems?为什么捆绑器不使用系统宝石?【发布时间】:2021-12-2222:39:12【问题描述】:捆绑器版本:1.15.1。Ruby版本:2.3.1。我有(来自gemenv):-GEMPATHS:-/var/lib/gems/2.3... 查看详情
为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]
】为啥此代码有效(具有无效非模板函数的C++模板类)?[复制]【英文标题】:Whythiscodeworks(C++templateclasswithinvalidnon-templatefunction)?[duplicate]为什么此代码有效(具有无效非模板函数的C++模板类)?[复制]【发布时间】:2020-12-0815:58... 查看详情
为啥库需要硬编码矢量化而不是编译器自动矢量化
】为啥库需要硬编码矢量化而不是编译器自动矢量化【英文标题】:Whydolibrariesneedhardcodedvectorizioninsteadofcompilerautovectorization为什么库需要硬编码矢量化而不是编译器自动矢量化【发布时间】:2016-07-0716:20:52【问题描述】:C++eigen... 查看详情
为啥在 __assume 中使用函数调用时 MSVC 不报错?
】为啥在__assume中使用函数调用时MSVC不报错?【英文标题】:Whydoesn\'tMSVCgiveoutanerrorwhenusingfunctioncallsin__assume?为什么在__assume中使用函数调用时MSVC不报错?【发布时间】:2014-01-0300:52:07【问题描述】:当我使用__assume(SomeFunc());它... 查看详情
为啥 createDataFrame 的推断器不将此数据创建为字符串的列?
】为啥createDataFrame的推断器不将此数据创建为字符串的列?【英文标题】:WhydoestheinferrerofcreateDataFramedoesn\'tcreatecolumnsthisdataasstrings?为什么createDataFrame的推断器不将此数据创建为字符串的列?【发布时间】:2016-02-1514:45:12【问题... 查看详情
Opengl为啥这个着色器不起作用?
】Opengl为啥这个着色器不起作用?【英文标题】:Openglwhydoesn\'tthisShaderWork?Opengl为什么这个着色器不起作用?【发布时间】:2017-08-1619:26:12【问题描述】:我试图创建一个类来绘制一个正方形,这个类将被实例化一次,每次我想... 查看详情
为啥这个 MSVC asm 块没有 ret,或者非 void 函数有返回?
】为啥这个MSVCasm块没有ret,或者非void函数有返回?【英文标题】:Whydoesn\'tthisMSVCasmblockhavearet,orthenon-voidfunctionhaveareturn?为什么这个MSVCasm块没有ret,或者非void函数有返回?【发布时间】:2021-07-1909:28:10【问题描述】:我正在学... 查看详情
MSVC 中的地址消毒器:为啥它在启动时报告错误?
】MSVC中的地址消毒器:为啥它在启动时报告错误?【英文标题】:AddressSanitizerinMSVC:whydoesitreportanerroronstartup?MSVC中的地址消毒器:为什么它在启动时报告错误?【发布时间】:2021-12-0904:55:22【问题描述】:我正在尝试将Qt与MSVC201... 查看详情
为啥我不能从 gcc 中的前身模板化成员函数访问祖先方法?
】为啥我不能从gcc中的前身模板化成员函数访问祖先方法?【英文标题】:WhyIcannotaccessancestormethodsfrompredecessortemplatedmemberfunctionsingcc?为什么我不能从gcc中的前身模板化成员函数访问祖先方法?【发布时间】:2011-07-1417:51:09【问... 查看详情
为啥 C 预处理器不忽略它跳过的块中的无效指令?
】为啥C预处理器不忽略它跳过的块中的无效指令?【英文标题】:Whydoesn\'ttheCpreprocessorignoreinvaliddirectivesinblocksitskips?为什么C预处理器不忽略它跳过的块中的无效指令?【发布时间】:2016-12-2517:27:36【问题描述】:考虑以下代码... 查看详情
在 GCC 的函数中禁用特定循环的自动矢量化
】在GCC的函数中禁用特定循环的自动矢量化【英文标题】:Disableauto-vectorizationofspecificloopsinafunctioninGCC【发布时间】:2014-05-1613:28:37【问题描述】:我想关闭函数中特定循环的自动矢量化。我怎样才能用GCC做到这一点?我知道我... 查看详情
为啥 msvc 让我这样做而不是 gcc / g++?
】为啥msvc让我这样做而不是gcc/g++?【英文标题】:Whydoesmsvcletmedothisbutnotgcc/g++?为什么msvc让我这样做而不是gcc/g++?【发布时间】:2010-10-0920:13:28【问题描述】:在msvc中,我有这样的函数并且它可以构建,但在gcc中它不喜欢它。v... 查看详情