在OpenCL中如何正确地将结果从本地内存求和到全局内存
我有一个OpenCL内核,其中每个工作组在本地内存中生成一个结果向量。然后,我需要将所有这些结果相加到全局内存中,以便以后检索到主机。在OpenCL中如何正确地将结果从本地内存求和到全局内存,opencl,reduce,Opencl,Reduce,我有一个OpenCL内核,其中每个工作组在本地内存中生成一个结果向量。然后,我需要将所有这些结果相加到全局内存中,以便以后检索到主机。 为了测试这一点,我创建了以下内核代码: //1st thread in each workgroup initializes local buffer if(get_local_id(0) == 0){ for(i=0; i<HYD_DIM; i++){ pressure_Local[i] = (float2){1.0f, 0.0f
为了测试这一点,我创建了以下内核代码:
//1st thread in each workgroup initializes local buffer
if(get_local_id(0) == 0){
for(i=0; i<HYD_DIM; i++){
pressure_Local[i] = (float2){1.0f, 0.0f};
}
}
//wait for all workgroups to finish accessing any memory
barrier(CLK_GLOBAL_MEM_FENCE | CLK_LOCAL_MEM_FENCE);
/// sum all the results into global storage
for(i=0; i<get_num_groups(0); i++){
//1st thread in each workgroup writes the group's local buffer to global memory
if(i == get_group_id(0) && get_local_id(0) == 0){
for(j=0; j<HYD_DIM; j++){
pressure_Global[j] += pressure_Local[j];
// barrier(CLK_GLOBAL_MEM_FENCE);
}
}
//flush global memory buffers:
barrier(CLK_GLOBAL_MEM_FENCE);
}
//每个工作组中的第一个线程初始化本地缓冲区
如果(获取本地id(0)=0){
对于(i=0;i您不能使用opencl在不同的工作组之间进行同步。CLK_GLOBAL_MEM_FENCE不以这种方式工作。它只保证内存操作的顺序(由工作组访问)将得到维护。请参阅中的“6.12.8同步功能”一节
我会为每个工作组使用不同的全局内存块来解决您的问题。您将数据写入全局,内核就完成了。然后,如果您想将数据减少到单个块,您可以创建另一个内核来从全局读取数据,并将其与其他结果块合并。您可以执行任意多个层次的操作根据需要进行合并,但最终合并必须由单个工作组完成
搜索gpu/opencl简化算法。这里有一个不错的开始