0

我不知道为什么下面的代码没有输出 1,2 而是一些随机数

#include <thrust/set_operations.h> 
#include <thrust/device_vector.h> 
#include <ostream> 

int main() { 

    int a[]= { 1,2,3,4,5,6};
    int b[] = {1,2,8};
    int *ga, *gb,*gr;
    cudaMalloc((void**)&ga, 6* sizeof(int));
    cudaMalloc((void**)&gb, 3* sizeof(int));
    cudaMalloc((void**)&gr, 3* sizeof(int));
    cudaMemcpy(ga, a, 6 * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(gb, b, 3 * sizeof(int), cudaMemcpyHostToDevice);
    thrust::device_ptr<int> end;
    thrust::device_ptr<int> gaptr(ga);
    thrust::device_ptr<int> gbptr(gb);
    thrust::device_ptr<int> grptr(gr);
    end = thrust::set_intersection(gaptr, gaptr+6, gbptr, gbptr+3,grptr);

    printf("%d ", *grptr);
    grptr++;
    printf("%d ", *grptr);  

getchar();

    return 0;


}

此外,如何使用 begin 和 end1 来遍历结果数组中的所有值

4

1 回答 1

0

您正在尝试使用迭代器对一个整数数组进行迭代到 device_vector。这是不可能的。从某种意义上说,指针就像数组的迭代器,您可以使用运算符 ++ 推进指针并使用 * 访问它指向的值。您可以直接使用 grptr 而不是尝试创建迭代器。

就是这样:

std::cout << *grptr << " ";
grptr++;
std::cout << *grptr << std::endl;

其他注意事项,如果您包含 . 保持一致并使用 cout。此外,如果你真的想尝试推力,你可以使用实际的推力向量而不是创建数组,手动复制它们并将它们包装在设备指针中(除非你试图学习推力和 cuda 运行时 api 之间的交互操作)。

编辑:我尝试了您编辑的代码,确实 printf 在 cout 工作时不起作用。问题是,thrust::device_ptr 是一个重载一元运算符* 的类,它的返回类型是thrust::device_reference。

从文档中:

template<typename T> __host__ __device__ reference thrust::device_ptr<T>::operator*(void) const

此方法取消引用此 device_ptr。

返回: 引用此 device_ptr 指向的对象的 device_reference。

要让它正确打印所需的值,您可以将其转换为 int:

printf("%d ", (int)*grptr);
grptr++;
printf("%d ", (int)*grptr);

在类推力::device_reference 的初始描述中,他们给出了一个 printf 示例,说明解决方案是强制转换。你可以在这里查看http://wiki.thrust.googlecode.com/hg/html/classthrust_1_1device__reference.html

于 2011-10-27T09:01:46.563 回答