C 在需要随机存取时改进随机存储器存取 我正在做什么的基本概念

C 在需要随机存取时改进随机存储器存取 我正在做什么的基本概念,c,caching,cuda,gpgpu,dynamic-programming,C,Caching,Cuda,Gpgpu,Dynamic Programming,完整联盟结构形成问题/组合拍卖 给定一组N个代理,这些代理的不相交子集产生最佳结果 例如,代理={a,b}及其值 {a}=2 {b}=3 {a,b}=4 在这种情况下,{{a},{b}}=5的联合将给出最佳结果,其中它是{a,b}的成对不相交子集 简言之,问题在于拆分一个集合,并检查拆分的总和是否大于原始集合。(这部分在生成拆分和如何表示数据方面做得很好。) 我如何表示数据基本上是一个值数组,其中索引是集合配置(集合表示为整数) 对于上述示例: int val[4]={0,2,3,4}whe

完整联盟结构形成问题/组合拍卖

给定一组N个代理,这些代理的不相交子集产生最佳结果

例如,
代理={a,b}
及其值

  • {a}=2
  • {b}=3
  • {a,b}=4
在这种情况下,
{{a},{b}}=5
的联合将给出最佳结果,其中它是
{a,b}
的成对不相交子集

简言之,问题在于拆分一个集合,并检查拆分的总和是否大于原始集合。(这部分在生成拆分和如何表示数据方面做得很好。)

我如何表示数据基本上是一个值数组,其中索引是集合配置(集合表示为整数)

对于上述示例:

int val[4]={0,2,3,4}
where set

  • {a}=01=索引1
  • {b}=10=索引2
  • {a,b}=11=索引3
因此,集合充当值数组中的索引

问题是,这给了随机内存访问,因为有大量的代理,其中有代码> 2 ^ n < /代码>值要考虑。p> 关于内存访问问题,请跳过此处 例如,在20个代理的环境中,给定两个元素的集合

100000000000000001
,元素
100000000000000000
的值为1048575个索引,距离
00000000000001
的距离为4194300字节,表示128字节距离的32767个cachline。因此,访问模式非常糟糕

我尝试寻找的解决方案包括根据基数/汉明权重对索引排序:

遭受算术开销的折磨,我的计算将掩盖随机访问的惩罚。特别是因为它使用了许多相关的计算,这些计算被序列化并阻塞了线程

作为最后的手段,我在这里再次问,当您的解决方案对随机访问没有要求时,是否有任何方法(我知道合并,这对于这个问题很难做到)来提高访问时间,或者说这是一种无助的状态


目前,由于这一点,我的指令重放开销约为45%,更改块大小不会产生显著的结果。是的,我试图通过计算每个线程的几个联合来隐藏延迟,这在某种程度上是可行的。

您是否尝试过使用1D纹理来保存数据?它处理随机访问的能力比全局内存稍好一些,特别是在费米之前的设备上。@aland不能,因为我需要写下更改。除非我在全局中进行临时复制,否则请复制回并将结果写入纹理内存。恐怕您对内存布局无能为力。我唯一的建议是使用巨大的页面或超级页面来最大化TLB的使用,至少你可以节省桌面行走的时间。