2011-10-27 75 views
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; 


} 

此外,如何使用開始和END1超過迭代的結果所有的值array

回答

0

您正在嘗試使用迭代器遍歷一個int整數數組到一個device_vector。這是不可能的。指針就像一個數組的迭代器,你可以用operator ++推進指針並訪問它指向的值*。您可以直接使用grptr而不是嘗試創建迭代器。

只是這個工程:

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

其他注意事項,如果包括不使用的printf。保持一致並使用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的陳述解決方案就是一個例子

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

在類推力的初始描述:: device_reference演員。你可以在這裏檢查http://wiki.thrust.googlecode.com/hg/html/classthrust_1_1device__reference.html

+0

我試過你的解決方案,但我仍然得到相同的輸出。輸出是85984256和85984260.對於它的外觀,這些看起來像內存地址。我編輯了修改的代碼,我在原郵政 – Programmer

+0

也跑了,我需要使用printf由於某些原因 – Programmer

+0

我編輯我的答案根據您的新問題。 – jmsu