用于数组处理的GPU cuda代码,摘要
GPU cuda code for array processing, abstract
我有一个包含数百万个整数值(输入)的数组。我想使用 GPU、nvidia gtx 780ti 或 gtx 980 分别对它们单独执行函数 F(input[x])
,然后将结果数组(输出)放回主内存,每个输出元素 output[x]
对应于输入数组元素 input[x]
。 F()
不包含任何浮点计算。
我如何为 gpu 正确组织这种大小数组(数百万个元素)的任务?
我正在寻找合适的 GPU 替代品:
for (int x=0; x<5000000; x++)
output[x] = F(input[x])
;
为了回答这个问题,我把评论转成这个答案:
您的用例很容易在 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 内核来完成此任务。
我有一个包含数百万个整数值(输入)的数组。我想使用 GPU、nvidia gtx 780ti 或 gtx 980 分别对它们单独执行函数 F(input[x])
,然后将结果数组(输出)放回主内存,每个输出元素 output[x]
对应于输入数组元素 input[x]
。 F()
不包含任何浮点计算。
我如何为 gpu 正确组织这种大小数组(数百万个元素)的任务?
我正在寻找合适的 GPU 替代品:
for (int x=0; x<5000000; x++)
output[x] = F(input[x])
;
为了回答这个问题,我把评论转成这个答案:
您的用例很容易在 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 内核来完成此任务。