Cuda 在内核调用中使用断言

Cuda 在内核调用中使用断言,cuda,assert,assertion,Cuda,Assert,Assertion,在设备模式的内核调用中是否有方便的方法使用断言 #define MYASSERT(condition) \ if (!(condition)) { return; } MYASSERT(condition); 如果您需要一些更有趣的东西,您可以使用CUDA网站上为注册开发者提供的cuPrintf()。CUDA现在有一个本机断言函数。使用断言(…)。如果它的参数为零,它将停止内核执行并返回错误。(如果在CUDA调试中,则触发断点。) 确保包含“assert.h”。此外,这需要2.x或更高的

在设备模式的内核调用中是否有方便的方法使用断言

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

MYASSERT(condition);

如果您需要一些更有趣的东西,您可以使用CUDA网站上为注册开发者提供的
cuPrintf()

CUDA现在有一个本机断言函数。使用
断言(…)
。如果它的参数为零,它将停止内核执行并返回错误。(如果在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;
}
#包括
__全局无效测试开始(无效)
{
int等于1;
int应该是one=0;
//这是没有效果的
断言(是一个);
//这将停止内核执行
断言(应该是一个);
}
int main(int argc,char*argv[])
{
testAssert();
cudaDeviceSynchronize();
返回0;
}

宏定义的末尾不应该有分号-通常使用宏时会有分号。此外,考虑将其实现如下,以避免它贪婪地附着到任何<代码> E/<代码>关键字,它可能正好发生在前面:<代码>(条件)/*什么也不做*/。else return如果在此之后的任何时候都有一个_syncthreads(),则应确保所有线程都达到相同的决策,否则可能会出现死锁。此外,您可以在全局内存中设置一个布尔标志(例如主机初始化为true的
bool success
)来指示事件。多个线程将
false
写入标志并不重要,因为它们总是写入相同的值,因此竞争是无关的。@Tom这不是真的。全局内存不是为这种用途而设计的,因此多个线程同时写入同一全局内存位置的结果是意外行为。@Auron如果说多个线程写入同一全局内存位置,则哪个线程获胜是未定义的,这是正确的。但是,如果所有线程都写入相同的值,那么哪一个线程获胜并不重要,因为最终结果是相同的。就像我说的,这是一场比赛,但比赛是无关的。@如果链接的答案不完整,我会在那里添加一条评论。如果一个扭曲中的多个线程写入同一个位置(非原子),则执行最终写入的线程未定义,但该位置将被更新。这与任何其他体系结构上的数据竞争完全相同,其中一个体系结构获胜时未定义,所有值是否将按顺序写入未定义,但位置将以其中一个值结束。有关更多信息,请参阅CUDA编程指南第4.1节。