我们在代码上运行cuda-memcheck --tool racecheck <executable>
。我们得到以下内存危险错误。
========= Race reported between Read access at 0x00004098 CUDA.cu:123:KernelFunction()
========= and Write access at 0x00005058 in CUDA.cu:146:KernelFunction() [529996 hazards]
这是密码。它声称第123行value = sharedMemory0[sharedMemoryIndex];
处于第146行sharedMemory0[sharedIndex0] = sharedMemory1[sharedIndex1];
的竞争状态。我们有
// Synchronization Point 1
__syncthreads();
__threadfence_block();
在两条线之间。难道不是所有的线程都在这一点上同步,所有以前的内存都在这一点上完成了吗?在启动第二个j-循环之前,所有线程和内存访问都应该在第一个j-循环之后完成。因此,在我们的头脑中,同步点1应该隔离两个j-循环,防止竞争条件,但是工具说这不是真的。
为什么报告竞赛条件的工具?对于我们能做些什么来防止它,有什么见解吗?
我们还看到了对一个工具的引用,该工具可以报告执行的跟踪,以便更容易地查看争用条件。我们可以使用什么工具和选项来获得跟踪,以更清楚地了解为什么存在竞赛条件?
for (i = 0; i < COUNT0; i++) {
// Synchronization Point 0
__syncthreads();
__threadfence_block();
for (j = 0; j < COUNT1; j++) {
index = j*blockDim.x + threadIdx.x;
if (index < THREAD_COUNT0) {
for (k = 0; k < COUNT2; k++)
sharedMemoryIndex = function0(index);
value = sharedMemory0[sharedMemoryIndex];
}
}
}
// Synchronization Point 1
__syncthreads();
__threadfence_block();
for (j = 0; j < COUNT2; j++) {
index = j*blockDim.x + threadIdx.x;
if (index < THREAD_COUNT1) {
sharedIndex0 = function1(index);
sharedIndex1 = function2(index);
sharedMemory0[sharedIndex0] = sharedMemory1[sharedIndex1];
}
}
}
我们还运行了同步检查工具cuda-memcheck --tool synccheck <executable>
,它在同步点1上报告了以下错误。这两个错误之间可能有很强的相关性,但是在cuda指南中并没有关于发散代码的同步是什么、为什么不好以及如何修复它的大量文档。
有什么评论吗?
========= Barrier error detected. Encountered barrier with divergent threads in block
========= at 0x00004ad8 in CUDA.cu:139:KernelFunction()
========= by thread (0,0,0) in block (8,0,0)
发布于 2016-04-25 09:46:53
没有足够的数据准确地指出你的问题。但是,最后一条错误消息非常重要:
Barrier error detected. Encountered barrier with divergent threads in block
看来,块中的一个线程达到了某些障碍,而另一个线程却没有达到,因为它位于一个未被占用的分支中。注意,如果在块中的线程之间的循环条件不同,那么发散分支不仅发生在if
条件中,而且也发生在循环中。
当一些线程因为它而错过一个__syncthreads()
时,可能会发生一些奇怪的事情。在实践中,这通常意味着这些线程停在不同的__syncthreads()
上,系统认为所有事情都是同步的,而不是同步的。这可能会导致您描述的赛车情况。
所以-找到你的发散的__syncthreads()
-这很可能是你的问题的原因。问题可能在你所包含的片段之前。
另外:
i
是局部变量(不是共享的)吗?COUNT0
都是相同的吗?https://stackoverflow.com/questions/36833129
复制相似问题