斑竹好,请问 如果一个半线程组中有一部分线程访问属于同一存储体的数据,会发生存储体冲突,降低运算效率。
但是如果一个线程组中的所有线程都要访问共享内存中的同一数据的话,是不是也存在 bank conflict?
如定义一个share变量,在线程块中的所有线程都会访问这个变量,都是只读的,会不会存在 bank conflict?
斑竹好,请问 如果一个半线程组中有一部分线程访问属于同一存储体的数据,会发生存储体冲突,降低运算效率。
但是如果一个线程组中的所有线程都要访问共享内存中的同一数据的话,是不是也存在 bank conflict?
如定义一个share变量,在线程块中的所有线程都会访问这个变量,都是只读的,会不会存在 bank conflict?
LZ您好:
对于您描述中的一些术语,自动脑补修正如下:(不保证脑补正确性)
半线程组——half warp
存储体——(shared memory的)bank
共享内存——shared memory
基于上述脑补,您的问题答复为:
1:一个half-warp内的多个线程(对于2.0及以上计算能力的硬件一般是按照warp考虑)读取同一bank的同一数据,会启动广播机制;如果是同一bank的不同数据,会发生bank conflict。
2:一个warp的线程都要读取shared memory中的同一个数据的话,会广播执行的。如果是写入,那么每个warp会有一个随机的线程成功。
3:不会bank conflict,会使用广播机制。以及此时您也可以将这个只读的变量使用constant cache缓冲,可能效果更好。
大致如此,您还可以参考下近期的如下帖子:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7019&extra=page%3D1
祝您好运~
谢谢斑竹的解答
对于斑竹提到的使用constant cache缓冲,不知constant cache缓冲要怎么用?
LZ您好:
最简单的方法是让这个常数作为kernel函数的参数,在2.0及以上的计算能力的硬件上会自动使用constant cache。
常规的用法是声明为__constant__,略复杂,请参阅programming guide。
大致如此,祝您好运~