我有以下代码:
__global__ void someKernel(unsigned char * global_mem, unsigned int * start) {
unsigned int size;
size = *(unsigned int *)&global_mem[start[blockIdx.x]];
//Do many things with size
}
来自同一个块的所有线程将从全局内存中读取相同的内存位置并使用它执行许多操作。 副本有多快/慢?我有一个256线程的块。
全局内存会广播到整个块,还是单个warp(意味着我必须从全局内存中进行256/32读取)?
在我第一次从全局内存读取到共享内存然后复制到寄存器(带有warp发散和同步开销)时,以下情况会更好:
__global__ void someKernel(unsigned char * global_mem, unsigned int * start) {
__shared__ int tmpsize;
unsigned int size;
int i = threadIdx.x;
if (i == 0) {
tmpsize = *(unsigned int *)&global_mem[start[blockIdx.x]];
}
__syncthreads();
size = tmpsize;
//Do many things with size
}
考虑到我有一个包含 256 线程块的巨大网格并且每个块读取不同的起始位置,这会更快吗