這是我的第一個問題;-)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
編譯乾淨。
您如何期待英特爾AVX指令在nVidia GPU上工作? – 2014-10-10 14:20:14
我看你現在已經編輯了一些問題來澄清一點 - 你需要將.cu文件中的特定於CPU的代碼移出到.c/.cpp文件,或者有條件地將其編譯爲僅用於CPU。 – 2014-10-10 14:51:02
@PaulR這是通常的建議。你想提供一個答案(我會upvote)。 – 2014-10-10 15:13:30