2013-09-08 2 views
0

가 여기 내 메이크 파일 출력입니다 : 내가 kmeans();, kmeans 전화CUDA는 아키텍처 x86_64의 운영 체제에 대한 정의되지 않은 기호는 X

nvcc -c -arch=sm_35 src/kmeans_cuda.cu 
nvcc -c -arch=sm_35 src/sequence.c 
nvcc -c -arch=sm_35 src/io.c 
nvcc -c -arch=sm_35 src/main.c 
nvcc -g -o cuda-means kmeans_cuda.o sequence.o io.o main.o 
Undefined symbols for architecture x86_64: 

    "_kmeans", referenced from: 
     _main in main.o 
    (maybe you meant: cudaError (anonymous namespace)::cudaLaunch<char>(char*)) 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

내 주요 기능에, kmeans_cuda.cu에 정의 된 C 함수이다

void kmeans() { 
long i,h,j,k; //counters 
long delta; //Number of objects has diverged in current iteration 
long nearest; //Nearest centroid 
unsigned int distance,min_distance; //distance calculated by relation point-cluster 

int *count,*recv_count; 
int *send_label; 
double begin,end,trans_init,trans_end; 
// should call kernel, but is not calling yet, because it's not implemented ... 

kmeans() 선언에 이미 __host__을 추가하려고했지만 문제가 해결되지 않았습니다. 나는 왜이 오류가 발생하는지 생각하고있다. 왜냐하면 나는 객체를 함수와 연결하고 있기 때문이다.

+0

nvcc에'-m64' 옵션을 추가하십시오. 그리고/또는 .cpp를 .cpp로 변경하십시오. – kangshiyin

+1

@ Eric : 이것은 아키텍처 불일치가 아니라 C++ 심볼 맹 글링 문제입니다. – talonmies

+0

@talonmies 그래서 나는 두 가지 추측을한다. – kangshiyin

답변

4

nvcc는 .cu 파일을 C++로 처리하며 호스트 코드는 .c 개의 파일 (즉 C에서는 C++이 아닙니다)에 저장합니다.

가장 쉬운 해결책은 간단 .cpp.c 파일의 이름을 변경하고, C와 같은 응용 프로그램을 처리하는 것이다 ++ 대신 C의 응용 프로그램은 또한 C는 C++ 대신 바인딩 바인딩을 사용하도록 컴파일러에 강제로 extern "C" {...}kmeans()을 선언 할 수 기능을 사용하지만, 불필요하게 비 숙련 인 모든 향후 기능에 대해 그렇게해야합니다.

+0

Extern "C"가 작동했는데, nvcc가 .c 클래스를 C++로 컴파일한다는 것을 몰랐습니다. –

+0

nvcc는 C++로 C를 컴파일하지 않습니다 (C 클래스와 같은 것은 없습니다). 규칙에 따라 .cpp 파일은 C++이고 .c 파일은 C.cu 파일은 장치 코드를 포함 할 수있는 C++ 파일입니다. 호스트 코드의 경우 nvcc는 어쨌든 호스트 컴파일러를 호출합니다. C가 아닌 C++ 라우트를 사용하기는하지만 기꺼이 정렬했기 때문에 다행입니다. – Tom

+0

작전 .c 파일을 말해야합니다. 내가 말하는 것은 내 파일의 확장자가 .c인데 nvcc가 호스트 코드를 컴파일하기 위해 gcc를 호출하지만 g ++을 호출하는 것 같습니다. –

관련 문제