正如标题所说,我正在对并行计算机视觉技术进行一些个人研究。使用 CUDA,我正在尝试实现霍夫变换的 GPGPU 版本。我遇到的唯一问题是在投票过程中。我正在调用 atomicAdd() 来防止多个同时写入操作,而且我似乎没有获得太多的性能效率。我在网上搜索过,但没有找到任何方法可以显着提高投票过程的性能。
非常感谢您在投票过程中提供的任何帮助。
正如标题所说,我正在对并行计算机视觉技术进行一些个人研究。使用 CUDA,我正在尝试实现霍夫变换的 GPGPU 版本。我遇到的唯一问题是在投票过程中。我正在调用 atomicAdd() 来防止多个同时写入操作,而且我似乎没有获得太多的性能效率。我在网上搜索过,但没有找到任何方法可以显着提高投票过程的性能。
非常感谢您在投票过程中提供的任何帮助。
I'm not familiar with the Hough transform, so posting some pseudocode could help here. But if you are interested in voting, you might consider using the CUDA vote intrinsic instructions to accelerate this.
Note this requires 2.0 or later compute capability (Fermi or later).
If you are looking to count the number of threads in a block for which a specific condition is true, you can just use __syncthreads_count()
.
bool condition = ...; // compute the condition
int blockCount = __syncthreads_count(condition); // must be in non-divergent code
If you are looking to count the number of threads in a grid for which the condition is true, you can then do the atomicAdd
bool condition = ...; // compute the condition
int blockCount = __syncthreads_count(condition); // must be in non-divergent code
atomicAdd(totalCount, blockCount);
If you need to count the number of threads in a group smaller than a block for which the condition is true, you can use __ballot()
and __popc()
(population count).
// get the count of threads within each warp for which the condition is true
bool condition = ...; // compute the condition in each thread
int warpCount = __popc(__ballot()); // see the CUDA programming guide for details
Hope this helps.
在很短的时间里,我确实使用了投票过程......
最后, atomicAdd 在两种情况下都变得更快
这个链接非常有用: warp-filtering
这是我解决的问题使用 Shuffle + ballot + popc 仅从 Warp 中的选定通道写入数据
你不是在寻找关键部分吗?