【问题标题】:nvcc with avx support cannot find gcc builtin intrinsics支持 avx 的 nvcc 找不到 gcc 内置内在函数
【发布时间】:2014-12-05 18:00:51
【问题描述】:

这是我的第一个问题 ;-)

我尝试在 CUDA 应用程序 (ccminer) 中使用 AVX,但 nvcc 显示错误:

/usr/local/cuda/bin/nvcc -Xcompiler "-Wall -mavx" -O3 -I . -Xptxas "-abi=no -v" -gencode=arch=compute_50,code=\"sm_50,compute_50\" --maxrregcount=80 --ptxas-options=-v -I./compat/jansson -o x11/x11.o -c x11/x11.cu
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/avxintrin.h(118): error: identifier "__builtin_ia32_addpd256" is undefined

[...]

这只是第一个错误。有许多“未定义”的内置函数 :-(

“C/C++”程序一切正常 - 带有 .c 或 .cpp 扩展名。但是 .cu - 错误 :-( 我做错了什么?我可以编译 ccminer,但我不能将 AVX 内部函数添加到 .cu 文件 - 只有 .c 文件。我使用 Intel 内部函数而不是 gcc。

非常感谢任何帮助。提前致谢。

Linux Mint (ubuntu 13) 64 位,gcc 4.8.1,cuda 6.5。

我不希望 AVX 在 GPU 上工作。在 .cu 文件中有一小部分基于 CPU 的代码,我想对其进行矢量化处理。

这是重现错误的示例。我举了一个最简单的例子: http://computer-graphics.se/hello-world-for-cuda.html

在开头添加一行:

#include <immintrin.h>

并尝试使用命令编译:

nvcc cudahello.cu -Xcompiler -mavx

出现错误:

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/avxintrin.h(118):错误: 标识符“__builtin_ia32_addpd256”未定义

相同的代码没有#include &lt;immintrin.h&gt; 编译没有问题。

这是完整的代码:

#include <stdio.h>
#if defined(__AVX__)
#include <immintrin.h>
#endif

const int N = 16; 
const int blocksize = 16; 

__global__ 
void hello(char *a, int *b) 
{
    a[threadIdx.x] += b[threadIdx.x];
}

int main()
{
    char a[N] = "Hello \0\0\0\0\0\0";
    int b[N] = {15, 10, 6, 0, -11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    char *ad;
    int *bd;
    const int csize = N*sizeof(char);
    const int isize = N*sizeof(int);

    printf("%s", a);

    cudaMalloc( (void**)&ad, csize ); 
    cudaMalloc( (void**)&bd, isize ); 
    cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice ); 
    cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice ); 

    dim3 dimBlock( blocksize, 1 );
    dim3 dimGrid( 1, 1 );
    hello<<<dimGrid, dimBlock>>>(ad, bd);
    cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost ); 
    cudaFree( ad );
    cudaFree( bd );

    printf("%s\n", a);
    return EXIT_SUCCESS;
}

编译

nvcc cudahello.cu -Xcompiler -mavx

获取错误或使用

nvcc cudahello.cu

编译干净。

【问题讨论】:

  • 您希望英特尔 AVX 指令如何在 nVidia GPU 上运行?
  • 我看到您现在已经编辑了问题以澄清一点 - 您需要将特定于 CPU 的代码从 .cu 文件移到 .c/.cpp 文件中,或者有条件地编译它仅适用于 CPU。
  • @PaulR 这是通常的建议。你想提供一个答案吗(我会赞成)。
  • 谢谢。我只是 CUDA/矢量化世界的初学者。所以一般规则是仅将 GPU 部分代码放在 .cu 文件中,而基于 CPU 的代码放在 .c/.cpp 文件中。正确吗?
  • 我投票决定关闭,因为 OP 没有提供MCVE SO 期望此类问题(“为什么我的代码不起作用”)。如果 OP 想通过我可以编译和验证的 MCVE 提供一个新问题,那么我将按照这些思路提供答案。 OP的代码可能存在其他问题。没有看到一个例子,我不想把它扫到地毯下。

标签: c linux cuda nvcc avx


【解决方案1】:

我想我有一个答案。函数如下:

_builtin_ia32_addpd256

内置在 gcc 中,而 nvcc 不知道它们。由于它们是在immintrin.h 中声明的,因此 nvcc 在编译包含 immintrin.h 的 .cu 文件时会返回错误。所以我们不能在一个文件中混合 cuda 特性和内置 gcc 函数。

【讨论】:

  • 是的。我刚刚得出了类似的结论。就我而言,/usr/local/cuda-6.5/bin/nvcc -fmad=true -arch=sm_20 -ftz=true -prec-div=false -prec-sqrt=false -c -ccbin g++ -Xcompiler -mavx,-m64,-O3,-pipe,-D_CUDA,,,,"-I/usr/include/mpich2 -I/usr/include/mpich2" -std=c++11 --compiler-options -fno-strict-aliasing -O3 -use_fast_math -m64 -I/usr/local/cuda-6.5/include -I.. cuda/cuda.cu -o cuda.o 给出了同样的错误。 (注意-mavx)。该错误未在 CUDA 7.0 中显示。
【解决方案2】:

这个问题实际上已在 CUDA 8 中得到解决,在 CUDA 8 附带的 nvcc 版本中,我可以编译包含 AVX 内部函数的代码(旧版本无法编译)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多