我有一个 2M+ 点的数组(计划在适当的时候增加到 20M),我正在通过 OpenCL 运行计算。我想删除落在随机三角形几何形状内的任何点。
如何在 OpenCL 内核进程中执行此操作?
我已经可以:
But:
可以在 openCL 上下文中删除 0,0 点吗?
注:我在 OpenFrameworks 中编码,因此 C++ 实现链接到 .cl 文件
只是大多数点落在原子条件内的情况的另一种选择:
可以有一个本地计数器和本地原子。然后将该原子合并到全局值,可以使用atomic_add()
。 Witch 将返回“之前的”全局值。因此,您只需将索引复制到该地址及以上地址即可。
这应该是一个明显的加速,因为线程将在本地同步,并且只在全局同步一次。全局副本可以是并行的,因为地址永远不会重叠。
例如:
__kernel mykernel(__global MyType * global_out, __global int * global_count, _global MyType * global_in){
int lid = get_local_id(0);
int lws = get_local_size(0);
int idx = get_global_id(0);
__local int local_count;
__local int global_val;
//I am using a local container, but a local array of pointers to global is possible as well
__local MyType local_out[WG_SIZE]; //Ensure this is higher than your work_group size
if(lid==0){
local_count = 0; global_val = -1;
}
barrier(CLK_LOCAL_MEM_FENCE);
//Classify them
if(global_in[idx] == ....)
local_out[atomic_inc(local_count)] = global_in[idx];
barrier(CLK_LOCAL_MEM_FENCE);
//If not, we are done
if(local_count > 0){
//Only the first local ID does the atomic to global
if(lid == 0)
global_val = atomic_add(global_count,local_count);
//Resync all the local workers here
barrier(CLK_LOCAL_MEM_FENCE);
//Copy all the data
for(int i=0; i<local_count; i+=lws)
global_out[global_val+i] = local_out[i];
}
}
注意:我没有编译它,但或多或少应该可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)