完成联盟结构形成问题/组合拍卖。
给定一组N个代理,这些代理的子集不相交会产生最佳结果。
E.g。 Agents = {a,b}
及其值
{a} = 2
{b} = 3
{a,b} = 4
在这种情况下,{{a},{b}} = 5
的联盟会给出最好的结果,它是{a,b}
的成对不相交的子集。
因此,简而言之,问题在于拆分集合并检查任何拆分总和是否大于原始集合。 (这部分与生成分裂以及如何表示数据一样好。)
我如何表示数据基本上是一个值数组,其中索引是设置配置(一个集合表示为整数)。
对于上面的示例:
int val[4] = {0,2,3,4}
其中设置
{a} = 01 = index 1
{b} = 10 = index 2
{a,b} = 11 = index 3
因此该集合充当值数组中的索引。
问题在于,这给出了随机内存访问,给定了大量需要考虑2^n
值的代理。
E.g。在20个代理的环境中,给定两个元素10000000000000000001
的集合,元素10000000000000000000
的值是距离00000000000000000001
1048575个索引,其内存为4194300个字节,代表32767个cachlines 128字节的距离。因此,可怕的访问模式。
我试图寻找的解决方案涉及按基数/汉明重量排序索引:
Determin the lexicographic distance between two integers
受到算术开销的影响,我的计算会使随机访问的惩罚蒙上阴影。特别是Hamming weight based indexing,因为它使用许多依赖计算,这些计算会被加强并阻塞线程。
作为最后的手段,我再次问这里,是否有任何方法(我知道合并,这对于这个问题很难做到),以改善您的解决方案随机访问时的解决方案的访问时间,或者它是无助的状态?
目前我大约有45%的指令重播开销,并且更改块大小没有给出显着的结果。是的,我尝试通过计算每个线程的几个联盟来隐藏延迟,这有点起作用。