为啥 MSVC12 的自动矢量化器不分析函数模板?

     2023-02-16     106

关键词:

【中文标题】为啥 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&gt;--- Analyzing function: void __cdecl someFunc&lt;int&gt;(int) 1&gt;c:\temp\test\test.cpp(321) : info C5001: loop vectorized 1&gt;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... 查看详情