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,它没有预先计算哈希键。对全局内存的访问不是随机的,而是由于我如何生成值而合并的。我通过删除哈希表进一步简化了我的实验。现在我只有一个整数输入列和一个整数输出列。同样,我想看看对全局内存的写入在不同内存范围内的实际行为。最后,我想了解哪些硬件属性会影响全局内存写入的性能,并看看是否可以根据代码预测预期的性能

我用两个内核测试了这一点,它们执行以下操作:

  • 从输入读取,从输出写入
  • 从输入读取、从输出读取和写入输出
  • 通过在group列中生成值,我还应用了两种不同的访问模式:

  • 顺序:按顺序递增数字,直到达到当前组的大小。当从输出列读取和写入时,此模式导致合并的内存访问
  • RANDOM:在当前组的大小内统一分布随机数。当从输出列读取和写入时,此模式导致未对齐内存访问
  • (1) 读写

    \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