关于在cuda中组织线程
about organizing threads in cuda
一般问题:线程数必须等于我想处理的元素的大小?例如:如果我有矩阵M[a][b]。我必须分配(aXb)线程,或者我可以分配更多的线程比我需要(超过ab)?因为关注元素aXb+1的线程会把我们扔出去,不是吗?或者解决方案是设置一个条件(仅当在(ab)范围内)?
具体问题:设M[x][y]矩阵,x行y列。考虑1000 <= x <= 300000, y <= 100。我如何组织线程,使它对x和y的每个输入都是通用的,我希望每个线程都关注矩阵中的一个元素。CC = 2.1谢谢!
一般答案:这取决于问题。
在大多数情况下,将问题自然地一对一映射到线程网格是可以开始的,但是您要记住的是:
- 实现高入住率
- 最大化GPU资源使用和内存吞吐量
- 处理有效数据
有时可能需要使用单个线程处理多个元素,或者使用多个线程处理单个元素。例如,您可以想象需要应用于元素数组的一系列独立操作A、B和C。您可以运行三个不同的内核,但更好的选择可能是分配网格,使其包含的线程数量是元素数量的三倍,并通过网格的一个维度(或其他任何维度)来区分操作。另一方面——你可能有一个问题,可能需要最大化共享内存的使用(例如转换图像)——你可以使用16个线程的块来处理5x5的图像窗口,其中每个线程将计算每个2x2切片的一些统计信息。
选择权在你——最好的建议并不总是随波逐流。尝试不同的方法,选择最有效的方法。
相关文章:
- 在cuda线程之间共享大量常量数据
- cuda:多个线程访问同一个全局变量
- cv::cuda::Stream选择线程默认流
- 为什么 cuda-gdb 会启动多个线程?
- 是否可以在多线程而不是 cuda/opencl C++运行 GPU?
- 多个线程访问同一个 cuda 流
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
- 如何在C++类中正确使用 CUDA 中的块和线程
- 如何在 CUDA 中的块中返回其他线程
- CUDA 将大于线程计数的数组复制到共享内存
- CUDA内核无缘无故地使用20K 线程崩溃
- CUDA中图像行 /列的线程索引
- 只有一个线程执行 CUDA 内核
- 当运行的线程数超过内核数时,CUDA性能会得到提高
- 在Cuda中启动2d线程块时崩溃
- CUDA 如何欺骗内核认为它在另一个线程中?
- CUDA - 了解线程的并行执行(扭曲)和合并的内存访问
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 如何在不使用原子的情况下同步 CUDA 中的线程
- CUDA 多线程:__threadfence不会阻止多个线程访问资源