gpu上的并行减少和计算错误的opencl

Posted

技术标签:

【中文标题】gpu上的并行减少和计算错误的opencl【英文标题】:Parallel reduction sum on gpu computes wrong opencl 【发布时间】:2016-03-29 13:36:01 【问题描述】:

所以我在全局内存中的gpu上写了一个并行归约和,因为我的gpu没有共享内存(我相信这意味着我不能使用本地内存?)。 问题是当我尝试添加超过 1024*4 的数字时,它开始输出错误的解决方案,通常会根据我输入的数字数量减少几百到几千。可能是什么原因? A 是输入,C 是输出。

  __kernel void GMM(__global float *A, __global float *B, __global float *C) 

uint global_id =get_global_id(0);
uint group_size=get_global_size(0);

B[global_id]=A[global_id];
for(int stride = group_size/2;stride>0;stride /=2)
 
    if(global_id<stride)
    
         B[global_id]+=B[global_id+stride];
     

if(global_id == 0)
C[get_group_id(0)]=B[0];

【问题讨论】:

您安排了多少个工作组,工作组的规模是多少? 我的全局大小为 1024*4,局部大小为 2,所以 2048 个工作组。 我想我正在输入某种上限,并最终添加了当我超过 1024*4 全局大小时已经添加的随机全局值? 你能写一个工作代码和一个非工作代码吗?具有全球和本地号码。 如果没有同步,这样的缩减就无法进行。无法保证工作项的执行顺序。此外,OpenCL 中还有no global sync 机制。所以你需要构建一个工作组感知的归约。 【参考方案1】:

显然解决了我确实有共享内存。通过使用 __local 内存和本地屏障,解决方案是一致且正确的!

【讨论】:

以上是关于gpu上的并行减少和计算错误的opencl的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL现在都支持哪些并行设备

cuda并行程序设计 gpu编程指南

从零开始学习OpenCL开发架构

1 个 cpu 设备上 OpenCL 的并行性

OpenCL

您好有个问题请教一下cpu怎么和gpu并行计算处理好日常软件