2014-10-10 68 views
-1

這是我的第一個問題;-)NVCC與AVX支持找不到GCC內建內在

我嘗試在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 

[。 ..]

這只是第一個錯誤。有許多'undefined'的內建函數:-(

'C/C++'程序一切正常 - 擴展名爲.c或.cpp。但.cu - error :-(我做錯了什麼?我可以編譯ccminer但我不能添加AVX內在函數.CU文件 - 。提前只有.c文件我使用英特爾內建函數不是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): error: identifier "__builtin_ia32_addpd256" is undefined

相同的代碼沒有#include <immintrin.h> 編譯沒有問題。

這裏是整個代碼:

#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

編譯乾淨。

+3

您如何期待英特爾AVX指令在nVidia GPU上工作? – 2014-10-10 14:20:14

+2

我看你現在已經編輯了一些問題來澄清一點 - 你需要將.cu文件中的特定於CPU的代碼移出到.c/.cpp文件,或者有條件地將其編譯爲僅用於CPU。 – 2014-10-10 14:51:02

+1

@PaulR這是通常的建議。你想提供一個答案(我會upvote)。 – 2014-10-10 15:13:30

回答

0

我想我有一個答案。功能如:

_builtin_ia32_addpd256 

內置於gcc和nvcc不知道他們。由於它們在immintrin.h中聲明,因此在編譯包含immintrin.h的.cu文件時,nvcc會返回錯誤。所以我們不能在一個文件中將cuda功能與內置的gcc功能混合使用。

+0

是的。我剛剛得出類似的結論。在我的例子中'/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-別名-O3 -use_fast_math -m64 -I/usr/local/cuda-6.5/include -I ..cuda/cuda.cu -o cuda.o'給出同樣的錯誤。 (注意-mavx)。該錯誤未在CUDA 7.0中顯示。 – r3x 2015-11-03 02:20:27

0

這個問題實際上是用CUDA 8修正的,nvcc版本隨CUDA 8一起發貨我可以編譯包含AVX intrinsics的代碼(我不能用老版本)。