推力设备迭代器无法正常工作

时间:2011-10-27 07:35:16

标签: cuda gpu thrust

我不知道为什么下面的代码没有输出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迭代结果数组中的所有值

1 个答案:

答案 0 :(得分:0)

您正尝试使用迭代器迭代一个int数组到device_vector。这是不可能的。指针就像数组的迭代器一样,你可以使用operator ++推进指针并访问它指向*的值。您可以直接使用grptr而不是尝试创建迭代器。

这是有效的:

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

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

编辑: 我尝试了你编辑过的代码,当cout工作时,printf确实不起作用。问题是,thrust :: device_ptr是一个具有一元运算符*重载的类,其返回类型是一个推力:: 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

相关问题