2014-05-13 3 views
3

예 :는 CUDA는 상수를 사용할 수 없습니다

#include <cuda.h> 
#include <stdint.h> 
#include <assert.h> 

__constant__ int32_t m; 

int main(int argc, char* argv[]) 
{ 
    void* s; 
    int r = cudaGetSymbolAddress(&s, m); 
    assert(r == cudaSuccess); 
    return 0; 
} 

컴파일 :

$ nvcc test.cu -o test -arch compute_20 -code sm_20 

실행 :

$ ./test 

가져 오기 :

test: test.cu:15: int main(int, char**): Assertion `r == cudaSuccess' failed. 
Aborted (core dumped) 

(일 경우, 에서 차이점을 확인하기 위해 두 개의 다른 컴퓨터에서 서로 다른 두 개의 카드로 테스트했습니다. 두 경우 모두 Cuda 6)

무엇이 잘못 되었나요?

+0

좋아, 내가 물지. 실제로 얻는 오류는 무엇입니까? 즉 'r'의 값은 무엇입니까? 그리고 논쟁은'& m'이 아니어야합니까? – Angew

+0

@Angew 두 가지 방법으로 작동해야합니다 .... 그럼에도 불구하고, 나는 당신의 제안을 시도했다. 그것도 작동하지 않습니다. 오류는 cudaErrorInvalidSymbol – dsign

+0

테스트 한 GPU는 무엇입니까? 코드가 실행되는 GPU보다 높은 타겟 아키텍처 용으로 코드를 컴파일하면 동일한 오류가 발생합니다. – sgarizvi

답변

2

@ sgar91에서 지적했듯이 문제는 컴파일 대상이 실제 GPU와 일치하지 않는다는 것입니다.

구체적으로 말하자면, 컴파일러가 sm_20 용 바이너리를 빌드하고 바이너리에 PTX가 없으므로 컴퓨터에 JIT 컴파일 할 수 없습니다 (컴퓨팅 기능> 2.0). 즉, -code sm_20이 있습니다. 따라서 GPU 작업이 실패합니다. -code compute_20 또는 하나 이상의 -gencode 인수가 있어야합니다 (자세한 예제는 nvcc manual 참조).

몇 가지 예 :이 여기에 도움이되었을 것이기 때문

$ nvcc test.cu -o test -arch compute_20 -code compute_20 
$ nvcc test.cu -o test -gencode="arch=compute_20,code=\"compute_20,sm_20,sm_30\"" 
$ nvcc test.cu -o test -gencode="arch=compute_20,code=\"sm_20,sm_21\"" -gencode="arch=compute_30,code=\"compute_30,sm_30\"" 

오히려 당신의 CUDA API 호출에 어설를하는 것보다, 당신은 실제 오류를보고해야합니다.

+1

톰 도움을 주셔서 감사합니다! 이것은 참으로 흥미 롭습니다! BTW, 당신은 멋진 회사에서 일합니다. – dsign

관련 문제