我需要一些帮助理解的罗恩·法伯的代码的行为:http://www.drdobbs.com/parallel/cuda-supercomputing-for-the-masses-part/208801731?pgno=2为什么全球+共享的速度比全球独自
我不理解如何使用共享MEM的是给在非共享内存更快的性能版。即,如果我再添加一些索引计算步骤并使用另一个Rd/Wr循环来访问共享内存,那么如何比单独使用全局内存更快?在这两种情况下,相同的数字或Rd/Wr循环访问全局内存。每个内核实例只能访问一次数据。数据仍然使用全局内存进/出。内核实例的数量是相同的。寄存器数量看起来是一样的。如何添加更多的处理步骤使其更快。 (我们没有减去任何流程步骤。)基本上我们正在做更多的工作,并且它正在更快地完成。
共享内存访问速度比全球快得多,但它不是零(或负值)。 我错过了什么?
的“慢”的代码:
__global__ void reverseArrayBlock(int *d_out, int *d_in) {
int inOffset = blockDim.x * blockIdx.x;
int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
int in = inOffset + threadIdx.x;
int out = outOffset + (blockDim.x - 1 - threadIdx.x);
d_out[out] = d_in[in];
}
的“快”的代码:
__global__ void reverseArrayBlock(int *d_out, int *d_in) {
extern __shared__ int s_data[];
int inOffset = blockDim.x * blockIdx.x;
int in = inOffset + threadIdx.x;
// Load one element per thread from device memory and store it
// *in reversed order* into temporary shared memory
s_data[blockDim.x - 1 - threadIdx.x] = d_in[in];
// Block until all threads in the block have written their data to shared mem
__syncthreads();
// write the data from shared memory in forward order,
// but to the reversed block offset as before
int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
int out = outOffset + threadIdx.x;
d_out[out] = s_data[threadIdx.x];
}
你在使用什么卡?它可以产生显着的差异。 – 2012-08-13 18:13:08
由于显着不同,较旧的卡仅支持在“正向顺序”模式下有效读取全局内存。较新的卡片不应该受此影响。 (我相信这在2.x发布时有所变化) – 2012-08-13 19:32:16
该文章写于2008年。硬件是费米前。我认为这是'老'卡。 – Doug 2012-08-13 19:45:40