如何使用 thrust::copy_if 使用指针
How to use thrust::copy_if using pointers
我正在尝试使用指针将数组的非零元素复制到另一个数组。我已尝试在 中实施解决方案,但结果数组中出现零。这是我的代码:
这是谓词仿函数:
struct is_not_zero
{
__host__ __device__
bool operator()( double x)
{
return (x != 0);
}
};
这就是使用 copy_if 函数的地方:
double out[5];
thrust::device_ptr<double> output = thrust::device_pointer_cast(out);
double *test1;
thrust::device_ptr<double> gauss_res(hostResults1);
thrust::copy_if(thrust::host,gauss_res, gauss_res+3,output, is_not_zero());
test1 = thrust::raw_pointer_cast(output);
for(int i =0;i<6;i++) {
cout << test1[i] << " the number " << endl;
}
其中 hostresult1 是内核的输出数组。
您犯了评论中讨论的各种错误,并且您没有提供完整的代码,因此无法说明您犯的所有错误。一般来说,您似乎混淆了设备和主机 activity 以及指针。这些通常应该在算法中保持分开并分开处理。例外情况是从设备复制到主机,但这不能用 thrust::copy
和原始指针来完成。您必须使用矢量迭代器或正确修饰的推力设备指针。
这是一个基于您展示的内容的完整示例:
$ cat t66.cu
#include <thrust/copy.h>
#include <iostream>
#include <thrust/device_ptr.h>
struct is_not_zero
{
__host__ __device__
bool operator()( double x)
{
return (x != 0);
}
};
int main(){
const int ds = 5;
double *out, *hostResults1;
cudaMalloc(&out, ds*sizeof(double));
cudaMalloc(&hostResults1, ds*sizeof(double));
cudaMemset(out, 0, ds*sizeof(double));
double test1[ds];
for (int i = 0; i < ds; i++) test1[i] = 1;
test1[3] = 0;
cudaMemcpy(hostResults1, test1, ds*sizeof(double), cudaMemcpyHostToDevice);
thrust::device_ptr<double> output = thrust::device_pointer_cast(out);
thrust::device_ptr<double> gauss_res(hostResults1);
thrust::copy_if(gauss_res, gauss_res+ds,output, is_not_zero());
cudaMemcpy(test1, out, ds*sizeof(double), cudaMemcpyDeviceToHost);
for(int i =0;i<ds;i++) {
std::cout << test1[i] << " the number " << std::endl;
}
}
$ nvcc -o t66 t66.cu
$ ./t66
1 the number
1 the number
1 the number
1 the number
0 the number
我正在尝试使用指针将数组的非零元素复制到另一个数组。我已尝试在
struct is_not_zero
{
__host__ __device__
bool operator()( double x)
{
return (x != 0);
}
};
这就是使用 copy_if 函数的地方:
double out[5];
thrust::device_ptr<double> output = thrust::device_pointer_cast(out);
double *test1;
thrust::device_ptr<double> gauss_res(hostResults1);
thrust::copy_if(thrust::host,gauss_res, gauss_res+3,output, is_not_zero());
test1 = thrust::raw_pointer_cast(output);
for(int i =0;i<6;i++) {
cout << test1[i] << " the number " << endl;
}
其中 hostresult1 是内核的输出数组。
您犯了评论中讨论的各种错误,并且您没有提供完整的代码,因此无法说明您犯的所有错误。一般来说,您似乎混淆了设备和主机 activity 以及指针。这些通常应该在算法中保持分开并分开处理。例外情况是从设备复制到主机,但这不能用 thrust::copy
和原始指针来完成。您必须使用矢量迭代器或正确修饰的推力设备指针。
这是一个基于您展示的内容的完整示例:
$ cat t66.cu
#include <thrust/copy.h>
#include <iostream>
#include <thrust/device_ptr.h>
struct is_not_zero
{
__host__ __device__
bool operator()( double x)
{
return (x != 0);
}
};
int main(){
const int ds = 5;
double *out, *hostResults1;
cudaMalloc(&out, ds*sizeof(double));
cudaMalloc(&hostResults1, ds*sizeof(double));
cudaMemset(out, 0, ds*sizeof(double));
double test1[ds];
for (int i = 0; i < ds; i++) test1[i] = 1;
test1[3] = 0;
cudaMemcpy(hostResults1, test1, ds*sizeof(double), cudaMemcpyHostToDevice);
thrust::device_ptr<double> output = thrust::device_pointer_cast(out);
thrust::device_ptr<double> gauss_res(hostResults1);
thrust::copy_if(gauss_res, gauss_res+ds,output, is_not_zero());
cudaMemcpy(test1, out, ds*sizeof(double), cudaMemcpyDeviceToHost);
for(int i =0;i<ds;i++) {
std::cout << test1[i] << " the number " << std::endl;
}
}
$ nvcc -o t66 t66.cu
$ ./t66
1 the number
1 the number
1 the number
1 the number
0 the number