2015-01-03 1 views

답변

2

실제로 "더 이상"이라는 단어는 다소 혼란 스럽습니다. 나는 아무것도 변화하지 않았다고 생각한다. Robert Crovella는 기술적 인면에서 그의 대답에서 extern "C"을 사용하는 것과 사용하지 않는 것의 주된 차이점을 지적했다.

그러나, 나는 혼란에 대한 이유 중 하나가 될 수있는 CUDA 커널에 대한 extern "C"를 사용하여 암시하는 중요한 차이점을 지적하고 싶습니다 :

CUDA는 드라이버 API를 사용하여, "CUDA 모듈"과 "CUDA 기능"을 수동으로로드 할 수 있습니다. CUBIN (CUDA 바이너리) 또는 PTX 파일을 산출하기 위해,

__global__ void exampleKernel(float** data) { ... } 

이는 NVCC 컴파일 할 수 있습니다 : 지금과 같은 커널을 포함하는 .CU 파일을 상상한다. 는 "CUDA 모듈"모듈로이 파일을로드 한 후, 하나는 기능 (즉, CUDA 커널)에 액세스 할 수 있습니다 :

cuModuleLoad(&cuModule, modulePath); 
cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 

대부분 성공하지 못합니다 두 번째 호출 : 커널, exampleKernel의 이름 것 C++ 함수로 간주되기 때문에 일 것입니다 (참조 Name mangling 참조). 커널이 예에서와 같이, extern "C"로 선언

: 더 이름 맹 글링이 발생하지 않으며, 함수가 예상대로

cuModuleGetFunction(&cuFunction, cuModule, "exampleKernel"); 

액세스 할 수 있습니다 다음

extern "C" __global__ void exampleKernel(float** data) { ... } 

.

1

예 사실 nvcc는 기본적으로 C++ 연결 스타일을 사용합니다. 나는 당신이 "더 이상"무엇을 의미하는지 확신하지 못합니다. 나는 그것이 오랫동안이 방법이었다고 생각한다.

다른 C/C++ 코드를 믹스와 마찬가지로, 대신 C 스타일을 외부 링크를 나타 내기 위해

extern "C" {} 

구조를 사용할 수 있습니다.

+0

'.cu' 파일을 C 파일로 컴파일하여 'extern "C"'가있는 모든 함수 프로토 타입이 파손되지 않도록 요청하는 방법이 있습니까? – user14717

+0

@ 닉, 당신은 모든 기능을 vanadlize하지 않아도됩니다. 'extern "C {"[모두들 여기에]}'안에 그들을 모두 감쌀뿐입니다. –

관련 문제