2010-01-17 8 views

답변

3
#define MYASSERT(condition) \ 
    if (!(condition)) { return; } 

MYASSERT(condition); 

당신은 당신이 등록 된 개발자를위한 CUDA 사이트에서 사용할 수 cuPrintf()을 사용할 수 있습니다 애호가 뭔가가 필요합니다.

+4

매크로 정의의 끝에 세미콜론이 없어야한다 - 그 세미콜론이있을 것이다 매크로의 일반적으로 사용. 또한,'else()'키워드 바로 앞에 붙는 것을 피하기 위해 다음과 같이 구현하는 것을 고려해보십시오.'if (condition)/* do nothing * /; else' –

+2

return 다음에 언제라도 __syncthreads()가 있으면 모든 스레드가 동일한 결정에 도달했는지 확인해야합니다. 그렇지 않으면 교착 상태에 빠질 수 있습니다. 또한 전역 메모리에서 부울 플래그 (예 : 호스트에서 true로 초기화 된 bool success)를 설정하여 이벤트를 나타낼 수 있습니다. 여러 스레드가 플래그에'false'를 쓰는 것은 중요하지 않습니다. 왜냐하면 항상 같은 값을 쓰고 있기 때문에 경주는 부적합합니다. – Tom

+0

@ 톰 그건 사실이 아니야. 전역 메모리는 그런 종류의 사용을 위해 설계되지 않았으므로 동일한 전역 메모리 위치에 동시에 쓰는 여러 스레드의 결과는 예기치 않은 동작입니다. – Auron

7

이제 CUDA에는 네이티브 어설 션 기능이 있습니다. assert(...)을 사용하십시오. 인수가 0이면 커널 실행을 중지하고 오류를 반환합니다. (또는 CUDA 디버깅에서 중단 점을 트리거하십시오.)

"assert.h"를 반드시 포함해야합니다. 또한,이 기능은 2.x 이상의 컴퓨팅 기능을 필요로하며 MacOS에서는 지원되지 않습니다. 자세한 내용은 CUDA C 프로그래밍 가이드, B.16 절을 참조하십시오.

프로그래밍 가이드는 또한이 예제를 포함

#include <assert.h> 
__global__ void testAssert(void) 
{ 
    int is_one = 1; 
    int should_be_one = 0; 
    // This will have no effect 
    assert(is_one); 
    // This will halt kernel execution 
    assert(should_be_one); 
} 
int main(int argc, char* argv[]) 
{ 
    testAssert<<<1,1>>>(); 
    cudaDeviceSynchronize(); 
    return 0; 
}