我在CUDA中编写一个函数,用于划分3D网格中的未排序点集。根据点集的边界,我可以找到每个点的坐标,并将其写入网格单元格中的数组中。
我通过在不同的块中将它们分成最大线程数来使用等于点数的线程启动内核。
现在每个线程找到它的坐标并在单元格中写入点,但是相同或不同块中的其他线程也可以同时计算相同的坐标。由于竞争条件,代码在这里失败。
我读过有关原子,锁和临界区的内容,但这些同步只在一个线程块中使用,在我的情况下不太可能。
有什么建议吗?
我的初步猜测是我需要根据网格单元格的距离对点进行排序,并使用等于网格单元大小的每个块启动内核
答案 0 :(得分:2)
Atomics可以处理全局内存并在块之间进行同步。这里唯一的问题是表现。仅仅通过执行对内存的写入占用了多少运行时间,您可能会获得比在CPU上串行执行代码更慢的代码。原子药很慢。也许试着重新思考这个问题。