我正试图围绕最有效的方式处理不确定大小的数组作为RS内核的输出。我会在out分配中发送最后一个相关数组槽的索引,但是我学会了in the answer to my previous question,在内核执行后,没有一种好的方法可以将全局传回java。我决定再次“缩小”这个过程,这会引导我进入下面的模式。
例如,假设我们有一个包含结构(或结构)的输入分配,它包含两个极坐标数组;来自bellow的set_pair:
typedef struct polar_tag{
uint8_t angle;
uint32_t mag;
} polar;
typedef struct polar_set_tag{
uint8_t filled_slots;
polar coordinates[60];
} polar_set;
typedef struct set_pair_tag{
polar_set probe_set;
polar_set candidate_set;
} set_pair;
我们希望在集合之间找到类似的坐标对,因此我们设置一个内核来决定哪个(如果有的话)极坐标相似。如果它们相似,我们将它加载到类似“matching_set”的输出分配中:
typedef struct matching_pair_tag{
uint8_t probe_index;
uint8_t candidate_index;
} matching_pair;
typedef struct matching_set_tag{
matching_pair pairs[120];
uint8_t filled_slots;
} matching_set;
使用像“filled_slots”这样的指令创建分配是使用RS处理这种不确定I / O的最有效(或唯一)方法,还是有更好的方法?
答案 0 :(得分:2)
我认为我试图接近这一点的方法是做两遍。
对于0-2案例:
设置:对于每个坐标,分配一个数组以保持最大预期对数(2)。
通过1:在coords上运行,通过将当前项目与其他coords的子集进行比较来查找对。当内核在被比较的其他coord上运行时,选择子集以避免重复的答案。
传递2:将#1的结果合并回列表或您想要的任何其他数据结构。如果坐标数很小,可以作为invokable运行。
对于0-N案例:
这变得更加艰难。我可能会做类似于上面的内容,但是对于典型数量的对,每个coord数组的大小。对于(希望很小的)溢出次数,使用atomics在溢出缓冲区中保留一个槽。这里的问题是我认为大多数GPU驱动程序对今天的原子不太满意。在CPU参考上会运行得很好。
有很多方法可以解决这个问题。一个重要的决策点围绕着比较是多么昂贵,以找到积分与写作结果的成本。