联合的全球记忆使用哈希写作
Coalesced global memory writes using hash
我的问题涉及融合的全球写入CUDA阵列的动态变化的元素集。考虑以下内核:
__global__ void
kernel (int n, int *odata, int *idata, int *hash)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
odata[hash[i]] = idata[i];
}
在这里,数组hash
的第一个n
元素包含odata
的索引,该索引将从idata
的第一个n
元素中更新。显然,这导致了可怕的合并不足。对于我的代码,一个内核调用的哈希人完全与另一个哈希完全无关(其他内核以其他方式更新数据),因此,只需重新排序数据以优化此特定的Kenrel,这不是一个选项。<<<<<<
CUDA中是否有一些功能可以使我改善这种情况的性能?我听到了很多关于纹理记忆的讨论,但是我无法将我阅读的内容转化为解决这个问题的解决方案。
纹理是一种仅读取机制,因此它不能直接提高散射的写入对gmem的性能。如果您是这样的"哈希":
odata[i] = idata[hash[i]];
(也许您的算法可以转换?)
那么,考虑纹理机制可能会有一些好处。(您的示例本质上似乎是1D)。
您还可以确保将共享内存/L1拆分优化针对缓存。
您可以限制哈希结果的范围吗?例如,您可能知道,线程的第一个1K迭代仅在odata
的0到8K范围内访问。
如果是这样,您可以使用共享内存。您可以分配共享内存的块,并暂时在共享内存上写入快速散布。然后将共享内存块写回合并交易中的全局内存。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 联合的全球记忆使用哈希写作