【问题标题】:CUDA: sum of data on a global memory variableCUDA:全局内存变量上的数据总和
【发布时间】:2012-08-18 23:04:24
【问题描述】:

我已经启动了一个包含 2100 个块和每个块 4 个线程的内核。

在这个内核中,所有线程都必须执行一个函数,并将其结果放在一个数组(在全局内存上)的“threadIdx.x”位置。

我当然知道,在这个项目中,函数总是返回 1.012086。 现在,我已经编写了这段代码来完成这个总和:

currentErrors[threadIdx.x]=0;
for(i=0;i<gridDim.x;i++)
{
    if(i==blockIdx.x)
    {
        currentErrors[threadIdx.x]+=globalError(mynet,myoutput);
    }
}

但是当内核结束时,所有数组的位置都有 1.012086 作为值(而不是 1.012086*2100)。

我哪里错了? 感谢您的帮助!

【问题讨论】:

  • 这个问题和您之前提出的问题都强烈表明您对 CUDA 的基础知识并不清楚。我认为您应该退后一步,阅读一本关于 CUDA 的介绍性书籍,然后再尝试继续您的项目。
  • 在发布这个问题之前,我已经阅读了关于减少的本指南,但没有找到任何适合我的具体案例的内容。 developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/…这里没有关于 Cuda Blocks 之间减少的信息
  • 安德烈亚,那意味着你没看懂论文。听从我的建议,一切都会变得清晰:)

标签: cuda sum


【解决方案1】:

要计算块的部分结果的最终总和,我建议按照以下方式进行:

  • 让每个块将部分结果写入 gridDim.x 大小数组的单独单元格中。
  • 将阵列复制到主机。
  • 在主机上执行最终求和。

我假设每个块都有很多要自己计算的东西,这首先保证了 CUDA 的使用。

在您当前的状态下 --- 我认为您的内核可能有问题。在我看来,每个块都在汇总所有数据,返回最终结果,就好像它是部分结果一样。

您提出的循环实际上没有意义。对于每个块,只有一个 i 会做一些事情。代码将等同于简单地编写:

currentErrors[threadIdx.x]=0;
currentErrors[threadIdx.x]+=globalError(mynet,myoutput);

保留一些不可预测的调度差异。

请记住,块不会同步执行。每个块都可以在任何其他块之前、期间或之后运行。


还有:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2012-02-03
    • 1970-01-01
    • 2020-08-17
    • 2011-09-09
    相关资源
    最近更新 更多