2016-07-22 114 views
-2

我正在CUDA中编写一个函数,该函数将三维网格中的未排序点集分开。基于点集的边界,我可以找到每个点的坐标并将其写入网格单元格内的数组中。如何避免CUDA中不同块的竞争条件

我使用线程数等于点数的方式启动内核,方法是将它们分为不同的块以获得最大线程数。

现在每个线程找到它的坐标并在单元格中写入点,但同一块或不同块中的其他线程也可以同时计算相同的坐标。由于竞争条件,代码在这里失败。

我读了关于原子,锁和关键部分,但这些同步仅在一个线程块内使用,这在我的情况中不太可能。

有什么建议吗?

我最初的猜测是,我需要根据网格单元尺寸的距离的点进行排序,并启动籽粒每一块等于网格单元

回答

2

原子能公司可以在全球内存工作和块之间同步的大小。这里唯一的问题是性能。取决于执行写入内存所占用的运行时间的多少,您可能会得到比在CPU上串行执行代码慢的代码。原子学很慢。也许尝试重新思考这个问题。