2014-10-10 4 views
-1

을 찾을 수없는이 내 첫 번째 질문 ;-)NVCC는 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 

[가. ..]

이것은 첫 번째 오류 일뿐입니다. 많은 '정의되지 않은'내장 함수가 있습니다 :-(

'C/C++'프로그램의 경우 .c 또는 .cpp 확장자를 사용하는 것이 좋습니다. 그러나 .cu-error :-(내가 뭘 잘못 했습니까? . ccminer를 컴파일하지만 파일 .CU하는 AVX의 내장 함수에 추가 할 수 없습니다 -... 내가 인텔 내장 함수를 사용하는 경우에만이 .c 파일을하지 GCC

어떤 도움이 크게 감사합니다 감사합니다 사전에

리눅스 민트 (우분투 13) 64 비트, gcc 4.8.1, cuda 6.5.

AVX가 GPU에서 작동하지 않을 것으로 예상하고 있습니다 .cu 파일에는 벡터화 할 작은 부분의 CPU 기반 코드가 있습니다.

다음은 오류를 재현하는 예입니다. 가지고 오류

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

http://computer-graphics.se/hello-world-for-cuda.html

시작 부분에

추가 된 행 : 나는에서 간단한 예제를했다

#include <immintrin.h> 

와 명령으로 컴파일 시도

동일한 코드가없는 #include <immintrin.h> 은 문제없이 컴파일됩니다. 오류를 얻을 수

nvcc cudahello.cu -Xcompiler -mavx

#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

것은 깨끗한 컴파일하기로 : 여기

는 전체 코드입니다.

+3

Intel AVX 명령어가 nVidia GPU에서 어떻게 작동 할 것으로 기대합니까? –

+2

조금 더 명확하게하기 위해 질문을 편집 한 것을 볼 수 있습니다. CPU 특정 코드를 .cu 파일에서 .c/.cpp 파일로 이동하거나 CPU 전용으로 조건부로 컴파일해야합니다. –

+1

@ PaulR 일반적인 조언입니다. 답변을 제공하고 싶습니까 (나는 upvote). –

답변

0

나는 대답이 있다고 생각합니다. 기능은 다음과 같습니다 :

_builtin_ia32_addpd256 

은 gcc에 내장되어 있으며 nvcc는 이에 대해 알지 못합니다. immintrin.h에 선언 되었기 때문에 nvcc는 immintrin.h가 포함 된 .cu 파일을 컴파일하는 동안 오류를 반환합니다. 그래서 우리는 하나의 파일에 내장 된 gcc 함수와 함께 cuda 기능을 혼합 할 수 없습니다.

+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, -m, -o, -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에는 표시되지 않습니다. – r3x

0

이 문제는 CUDA 8과 함께 제공되는 nvcc 버전과 함께 실제로 수정되었으며, AVX 내장 함수 (이전 버전에서는 사용할 수 없음)가 포함 된 코드를 컴파일 할 수 있습니다.