4
A
답변
3
#define MYASSERT(condition) \
if (!(condition)) { return; }
MYASSERT(condition);
당신은 당신이 등록 된 개발자를위한 CUDA 사이트에서 사용할 수 cuPrintf()
을 사용할 수 있습니다 애호가 뭔가가 필요합니다.
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;
}
매크로 정의의 끝에 세미콜론이 없어야한다 - 그 세미콜론이있을 것이다 매크로의 일반적으로 사용. 또한,'else()'키워드 바로 앞에 붙는 것을 피하기 위해 다음과 같이 구현하는 것을 고려해보십시오.'if (condition)/* do nothing * /; else' –
return 다음에 언제라도 __syncthreads()가 있으면 모든 스레드가 동일한 결정에 도달했는지 확인해야합니다. 그렇지 않으면 교착 상태에 빠질 수 있습니다. 또한 전역 메모리에서 부울 플래그 (예 : 호스트에서 true로 초기화 된 bool success)를 설정하여 이벤트를 나타낼 수 있습니다. 여러 스레드가 플래그에'false'를 쓰는 것은 중요하지 않습니다. 왜냐하면 항상 같은 값을 쓰고 있기 때문에 경주는 부적합합니다. – Tom
@ 톰 그건 사실이 아니야. 전역 메모리는 그런 종류의 사용을 위해 설계되지 않았으므로 동일한 전역 메모리 위치에 동시에 쓰는 여러 스레드의 결과는 예기치 않은 동작입니다. – Auron