我正在对某些AVX和AVX2指令进行性能测试。尝试编译使用_mm256_cexp_ps内部函数的代码时,我遇到了一个奇怪的问题。这是我收到的错误。
vectorize.c:34:14: warning: implicit declaration of function '_mm256_cexp_ps' is invalid in C99 [-Wimplicit-function-declaration]
arr01[i] = _mm256_cexp_ps(arr01[i]);
vectorize.c:34:12: error: assigning to '__m256' (vector of 8 'float' values) from incompatible type 'int'
arr01[i] = _mm256_cexp_ps(arr01[i]);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
此函数/本征函数绝对应返回__m256类型的值。参见this documentation page
我正在使用GCC,当我运行gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --
with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
导致此错误的代码如下:
__m256 * arr01 = (__m256 *)malloc(TOTAL * 8 * sizeof(float));
// Some irrelevant code left out.
for (int i = 0; i < TOTAL; ++i) {
arr01[i] = _mm256_cexp_ps(arr01[i]);
}
我包括了x86intrin.h。我已经编译并成功运行了使用avx2指令的代码。问题似乎特别是与这种内在因素有关。我正在使用以下命令行来编译此代码。
gcc -mavx2 vectorize.c
据我所知,应该没有类型不兼容。我绝对不是C语言方面的专家。我可能在这里错过了一些东西。
很久以前,我在Visual Studio上遇到了一个与之相关的问题,事实证明Visual Studio实际上正在将我编写的汇编指令转换为其他指令。我倾向于相信GCC不会释放具有错误的内部定义的头文件。