【问题标题】:GPU cuda code for array processing, abstract用于数组处理的 GPU cuda 代码,抽象
【发布时间】:2015-06-19 23:45:38
【问题描述】:

我有一个包含数百万个整数值(输入)的数组。我想使用 GPU、nvidia gtx 780ti 或 gtx 980 分别对它们执行函数F(input[x]),然后将结果数组(输出)返回到主内存中,每个输出元素 output[x] 对应于输入数组元素 @ 987654324@。 F() 不包含任何浮点计算。

我如何为 gpu 正确组织这种大小数组(数百万个元素)的任务?

我正在寻找合适的 GPU 替代品:

for (int x=0; x<5000000; x++)

output[x] = F(input[x]);

【问题讨论】:

  • 您也可以编写一个简单的 CUDA 内核来执行此操作。这可能是所有问题中最容易在 GPU 上“组织”的问题。看看 CUDA 矢量添加示例代码。那是output[x] = F(input1[x], input2[x]),但是将其进一步简化为您所询问的内容是一件小事。
  • @m.s.我认为这个问题应该很容易回答。如果您想提供答案,我会投票。

标签: arrays cuda gpu gpgpu


【解决方案1】:

为了提供这个问题的答案,我把cmets转换成这个答案:

您的用例很容易在 CUDA 中实现。 一个非常适合初学者的方法是使用Thrust

#include <iostream>
#include <thrust/sequence.h>

#include <thrust/transform.h>
#include <thrust/device_vector.h>

struct F
{
     __device__
     int operator()(int value) const
     {
         // just a dummy function
         return value*value;
     }
};

int main()
{
     const int N = 10;
     thrust::device_vector<int> input(N);
     // filling the input with dummy values
     thrust::sequence(input.begin(), input.end());
     thrust::device_vector<int> output(N);
     thrust::transform(input.begin(), input.end(), output.begin(), F());
     thrust::copy(output.begin(), output.end(), std::ostream_iterator<int>(std::cout, " "));

     return 0;
}

编译并运行此代码产生:

$ nvcc transform.cu && ./a.out

0 1 4 9 16 25 36 49 64 81

当然,您也可以按照 Robert 的建议编写一个非常简单、普通的 CUDA 内核来完成这项任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多