2010-01-17 41 views

回答

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

MYASSERT(condition); 

,如果你需要的东西票友可以使用cuPrintf()这可从CUDA网站注册的开发。

+4

不应有在宏定义的端部分号 - 通常使用的宏将具有分号。另外,考虑像下面这样执行它,以避免它贪婪地附加到它可能发生的任何'else'关键字之前:'if(condition)/ * do nothing * /; else return' – 2010-01-17 09:10:14

+2

如果在此之后的任何时候你有一个__syncthreads(),你应该确保所有的线程都达到相同的决定,否则你可能会死锁。此外,您可以在全局内存中设置一个布尔标志(例如,由主机初始化为“bool success”)来指示事件。不要紧,因为多个线程总是写相同的值,因此这个比赛是无关紧要的,因此多个线程将向该标志写入'false'。 – Tom 2010-01-17 20:09:42

+0

@Tom这是不正确的。全局内存不是为这种用法而设计的,因此几个线程同时写入同一个全局内存位置的结果是意想不到的行为。 – Auron 2012-02-29 10:26:09

7

CUDA现在具有本机断言功能。使用assert(...)。如果其参数为零,则会停止内核执行并返回错误。 (或者如果在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; 
}