vload4超过4次单内存访问有什么优势?
假设我从本地内存加载内存。以下是两个内核。 第二个内核应该没有银行冲突。第一个是否存在银行冲突? 因为,如果每个时钟执行一个vload,那么应该存在冲突。
void kernel1(__local int* localBuffer) {
int start = get_local_id(0)*4;
int4 test = vload4(start,localBuffer);
}
void kernel2(__local int* localBuffer) {
int4 test;
int start = get_local_id(0)*4;
test.x = localBuffer[start];
test.y = localBuffer[start+1];
test.z = localBuffer[start+2];
test.w = localBuffer[start+3];
}
答案 0 :(得分:2)
您展示的两个内核在GPU上同样糟糕。在访问本地内存时,vload4不会在Nvidia或AMD GPU上的单个时钟周期内执行。它作为4个负载的序列执行。为了避免GPU上的银行冲突,您应该踩到get_local_size(0)
的倍数,即使用test.w = localBuffer[start+3*get_local_size(0)];
。如果您使用的是2维或3维,则该步骤应为get_local_size(0) * get_local_size(1) * get_local_size(2)
。
CPU的情况有所改变。在CPU上,本地内存实际上只是全局内存的一部分,CPU具有汇编代码指令,可在单个操作中加载int4向量。一个好的编译器应该为vload4使用这个本机向量加载,并且希望足够聪明,看看kernel2也可以使用向量加载操作(假设你没有禁用优化)。当然,这还取决于编译器是否尝试在单个工作项中使用向量操作或将多个工作项组合在一起。如果它执行后者,则kernel2可能无法优化以使用单个向量加载,从而导致内存吞吐量降低。
答案 1 :(得分:0)
优点是可以合并相邻的工作项读取。个人阅读没有机会这样做。