我想使用CUDA内核函数标记许多对象。主要目的是找到那些没有被任何线程标记的对象。我希望ro使用竞争性写入来实现这一点,即每个线程写入TRUE到一个阵列,其中每个位置对应一个对象,在此期间可能有几个线程同时写入同一位置。此数组的初始值为FALSE。如果在操作后它仍然为FALSE,那么我就知道该对象没有被任何线程标记。
我的想法是个不错的选择吗?或者我应该使用像atomicAdd()这样的其他功能?我不需要确切地知道已写了多少线程。
答案 0 :(得分:1)
好的,我已经通过“相关问题”找到了anwser:
对于CUDA程序,如果warp中的多个线程写入同一位置,则该位置将被更新,但未定义位置更新的次数(即,串联发生的实际写入次数)并且未定义哪个线程最后会写(即哪个线程将赢得比赛)。
对于计算能力2.x的设备,如果warp中的多个线程写入同一地址,则只有一个线程实际执行写操作,该线程未定义。
来自CUDA C编程指南第F.4.2节:
如果warp执行的非原子指令写入warp的多个线程的全局内存中的同一位置,则只有一个线程执行写操作,而哪个线程执行该操作是未定义的。
有关详细信息,另请参阅本指南的第4.1节。
换句话说,如果写入给定位置的所有线程都写入相同的值,那么它是安全的。
嗯,我认为这是使用竞争性写作实现目标的好方法。