我有一个大规模的二维数组,我正在进行计算(在X中的512行中为4.3bil(32位无符号整数))我尝试使用openCL加速。
我显然不能同时做到这一点,所以我尝试了二维工作组设置。
每个"列",其中43亿,其中一行数学和位旋转产生下一行。所以我可以动态生成所有值。
但是由于当前工作行上方的行必须已经设置了一个值,我需要确保当工作组启动时,该组"上面的"已经完成了。彼此相邻的群体并不重要 - 列不会与其他列互动。
工作组是如何解雇的?在X上,然后将X重置为0并将Y递增1?随机跳跃?是否有任何押韵或理由?
并且工作组可以被告知要等到上面的小组“#39;它已经完成了?
我知道我的下一个,上面,下面,行,列在二维数组编程意义上是没有意义的,但它帮助我至少可视化问题。
如果我可以确保团队不会超前,我可以让它发挥作用。只是不确定如何。
我知道有些围栏确保其他工作项目已经赶上
答案 0 :(得分:0)
在OpenCL中的内核调用中,无法在工作组之间进行同步。如果需要跨多个工作组进行全局内存同步,则需要将多个内核排入队列。
如果每列都是独立的工作,听起来每列启动一个工作项会更简单,并让它为该列执行每一行。如下所示:
kernel void foo(...)
{
int column = get_global_id(0);
for (int row = 0; row < 512; row++)
{
// Do processing for (column,row), based on (column,row-1),
// which was also processed by this work-item
}
}
这将作为一维内核启动,全局大小等于列数。