【问题标题】:inlining failed in call to always_inline '__m256d _mm256_broadcast_sd(const double*)'内联调用 always_inline '__m256d _mm256_broadcast_sd(const double*)' 失败
【发布时间】:2017-12-11 06:48:58
【问题描述】:

我正在尝试运行一个由我的朋友创建的 Visual Studio cpp 项目。我正在尝试在没有 VS 的情况下运行该文件。但我得到了一个错误列表,格式相同:

inlining failed in call to always_inline '__m256d _mm256_broadcast_sd(const double*)': target specific option mismatch|

它在带有发布模式的VS中正常运行,在调试模式下运行时中断。

includes 如下:

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
# include <omp.h>
#include <chrono>
#include <fstream>
#include <algorithm>

#include <immintrin.h>

using namespace std::chrono;
using namespace std;

并且从这里调用错误:

double zero = 0;
__m256d acc = _mm256_broadcast_sd(&zero);

更新:

我正在使用这个命令来运行它:g++ -std=c++0x multip.cpp -o multip,是否有额外的参数可以将 -mavx 添加到编译器调用中?

【问题讨论】:

  • 旁注不能解决您的问题:您可以使用 _mm256_setzero_pd()
  • 相关:The Effect of Architecture When Using SSE / AVX Intrinisics 解释了 GCC/clang 与 MSVC/ICC 的不同之处:GCC/clang 要求您启用使用内在函数的扩展。他们永远不会在没有-msse4.1 的情况下发出 SSE4.1 指令,即使来自内在函数也是如此。

标签: c++ gcc x86 intrinsics avx


【解决方案1】:

"Target specific option mismatch" 表示您在 GCC 调用中缺少功能标志。您可能需要将-mavx 添加到您的编译器调用中。

如果您打算仅在您的计算机上运行它,-march=native 将打开您自己的计算机支持的所有功能标志。

【讨论】:

  • g++ -std=c++0x multip.cpp -o multip这是我用的,应该可以在任何人的机器上运行。
  • @SachiDangalla 这个broadcast instruction 需要支持AVX instruction set 的CPU。它不会在任何人的机器上运行,而只能在支持该指令的机器上运行。
  • 所以在一台有AVX指令的机器上,代码在VS中可以正确运行,但在命令行中不行。有没有额外的参数可以使用?
  • @SachiDangalla,您需要更具体地说明您收到的错误。
  • @SachiDangalla:Visual Studio 允许您将内部函数用于尚未启用编译器使用的指令集。在 GCC 或 clang 中不是这种情况。如果您从命令行运行 MSVC 的编译器,它的工作方式与在 VS 内部相同......顺便说一句,我强烈建议使用 -march=native-march=haswell 或代替 just -mavx , 设置适合现代 CPU 的调优选项以及启用 AVX + AVX2 + FMA + popcnt + BMI1/2 + 等。或-march=znver1 用于 Ryzen。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多