如何解决使用CUDA的Thrust库获取较大的值
| 嗨,我想实现一个推力极大的循环,但是我发现它比普通的C ++代码慢得多。你能告诉我我要去哪里错了。 fi和fj是宿主载体 xsize通常是大约7-8位数字thrust::host_vector <double> df((2*floor(r)*(floor(r)+1)+1)*n*n);
thrust::device_vector<double> gpu_df((2*floor(r)*(floor(r)+1)+1)*n*n);
for(i=0;i<xsize;i++)
{
gpu_df[i]=(fi[i]-fj[i]);
if(gpu_df[i]<0)
gpu_df[i]=0;
else
gpu_df[i]=gpu_df[i]*(fi[i]-fj[i]);
if(gpu_df[i]>255)
gpu_df[i]=255;
// cout<<fi[i]<<\"\\n\";
}
df=gpu_df;
我觉得代码没有被并行化。你能帮我一下吗。
解决方法
要使用Thrust在GPU上运行程序,您需要使用Thrust算法编写程序,例如
reduce
,transform
,sort
等。在这种情况下,我们可以用transform
编写计算,因为循环只是计算函数F(fi[i],fj[i])
和将结果存储在“ 6”中。请注意,在调用transform
之前,我们必须先将输入数组移至设备,因为Thrust要求输入和输出数组位于同一位置。
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/functional.h>
#include <cstdio>
struct my_functor
: public thrust::binary_function<float,float,float>
{
__host__ __device__
float operator()(float fi,float fj)
{
float d = fi - fj;
if (d < 0)
d = 0;
else
d = d * d;
if (d > 255)
d = 255;
return d;
}
};
int main(void)
{
size_t N = 5;
// allocate storage on host
thrust::host_vector<float> cpu_fi(N);
thrust::host_vector<float> cpu_fj(N);
thrust::host_vector<float> cpu_df(N);
// initialze fi and fj arrays
cpu_fi[0] = 2.0; cpu_fj[0] = 0.0;
cpu_fi[1] = 0.0; cpu_fj[1] = 2.0;
cpu_fi[2] = 3.0; cpu_fj[2] = 1.0;
cpu_fi[3] = 4.0; cpu_fj[3] = 5.0;
cpu_fi[4] = 8.0; cpu_fj[4] = -8.0;
// copy fi and fj to device
thrust::device_vector<float> gpu_fi = cpu_fi;
thrust::device_vector<float> gpu_fj = cpu_fj;
// allocate storage for df
thrust::device_vector<float> gpu_df(N);
// perform transformation
thrust::transform(gpu_fi.begin(),gpu_fi.end(),// first input range
gpu_fj.begin(),// second input range
gpu_df.begin(),// output range
my_functor()); // functor to apply
// copy results back to host
thrust::copy(gpu_df.begin(),gpu_df.end(),cpu_df.begin());
// print results on host
for (size_t i = 0; i < N; i++)
printf(\"f(%2.0lf,%2.0lf) = %3.0lf\\n\",cpu_fi[i],cpu_fj[i],cpu_df[i]);
return 0;
}
作为参考,这是程序的输出:
f( 2,0) = 4
f( 0,2) = 0
f( 3,1) = 4
f( 4,5) = 0
f( 8,-8) = 255
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。