Opencl 了解对全局内存的随机写入的性能行为
我正在进行一些实验,旨在了解对全局内存的随机读写访问行为 以下内核使用合并访问模式从输入向量(Opencl 了解对全局内存的随机写入的性能行为,opencl,gpu,ptx,Opencl,Gpu,Ptx,我正在进行一些实验,旨在了解对全局内存的随机读写访问行为 以下内核使用合并访问模式从输入向量(groupColumn)中读取数据,并从全局内存中的哈希表中读取随机条目 struct条目{ uint组; 单元有效载荷; }; typedef结构条目; __内核无效全局\u随机\u写入\u访问(\u全局常量*restrict groupColumn, __全局条目*全局哈希表, __常量哈希表大小, __常量哈希表大小位, __康斯坦特批次, __警察(步幅){ int global_id=get_
groupColumn
)中读取数据,并从全局内存中的哈希表中读取随机条目
struct条目{
uint组;
单元有效载荷;
};
typedef结构条目;
__内核无效全局\u随机\u写入\u访问(\u全局常量*restrict groupColumn,
__全局条目*全局哈希表,
__常量哈希表大小,
__常量哈希表大小位,
__康斯坦特批次,
__警察(步幅){
int global_id=get_global_id(0);
int local_id=get_local_id(0);
uint end=批次*步幅;
单位和=0;
对于(int i=0;i有效负载;//随机读取
}
if(本地\u id<哈希\u表\u大小){
globalHashTable[local_id]。有效负载=sum;//罕见的合并写入
}
}
我在nvidiav100卡上多次迭代运行了这个内核。结果的方差非常小,因此,我只绘制了每组配置一个点。输入数据大小为1 GiB,每个线程处理128个条目(BATCH=128
)。结果如下:
到目前为止还不错。V100的最大内存带宽约为840GiB/秒,考虑到存在随机内存读取,测量结果足够接近
现在,我正在使用以下内核测试对全局内存的随机写入:
\uuuuuu内核无效全局随机写入访问(\uuuu全局常量*restrict groupColumn,
__全局条目*全局哈希表,
__常量哈希表大小,
__常量哈希表大小位,
__康斯坦特批次,
__警察(步幅){
int global_id=get_global_id(0);
int local_id=get_local_id(0);
uint end=批次*步幅;
单位和=0;
对于(int i=0;ipayload=sum;//随机写入
}
if(本地\u id<哈希\u表\u大小){
globalHashTable[local_id]。有效负载=sum;//罕见的合并写入
}
}
锁销:
对于少数组,性能显著下降到几GiB/秒。
我无法理解这种行为。一旦哈希表达到L1的大小,性能似乎就受到L2的限制。对于较少的组,性能要低得多。我真的不明白限制因素是什么
CUDA文档没有说明如何在内部处理存储指令。我唯一能找到的是,如果另一个线程试图通过ld.ca
读取相同的加法,则st.wb
PTX指令()可能会对陈旧的一级缓存造成命中。但是,这里没有对哈希表的读取
非常感谢您提供任何有关了解性能行为的提示或链接
编辑: 实际上,我在代码中发现了一个bug,它没有预先计算哈希键。对全局内存的访问不是随机的,而是由于我如何生成值而合并的。我通过删除哈希表进一步简化了我的实验。现在我只有一个整数输入列和一个整数输出列。同样,我想看看对全局内存的写入在不同内存范围内的实际行为。最后,我想了解哪些硬件属性会影响全局内存写入的性能,并看看是否可以根据代码预测预期的性能 我用两个内核测试了这一点,它们执行以下操作:
\uuuuu内核void global\u write\u访问(\uuuu global const*restrict groupColumn,
__全局uint*限制输出,
__康斯坦特批次,
__警察(步幅){
int global_id=get_global_id(0);
int local_id=get_local_id(0);
uint end=批次*步幅;
单位和=0;
对于(int i=0;i
PTX代码:
(2) Read,Read&Wr