2014-10-05 83 views
-1

我有以下一小段代碼,它使用thrust :: minmax_element來查找3個浮點數結構的最小值和最大值。但編譯器總是說參數列表不匹配。我使用CUDA 6.5在Mac OS 10.9thrust :: minmax_element argumentsmen列表不匹配

struct Float3 {float x, y, z;}; 
    struct Comparator : public binary_function<Float3, Float3, bool> { 
    __host__ __device__ bool operator()(const Float3& a, const Float3& b) const 
    { 
     return a.x > b.x; 
    } 
    }; 
    Float3 a[10]; 
    thrust::minmax_element(device_ptr<Float3>(a), 
         device_ptr<Float3>(a) + 10, 
         Comparator()); 

回答

2

在未來,請提供一個完整的例子,有人可以複製,粘貼,並編譯看問題,而不添加任何內容或改變任何東西。

Float3 a[10]; 

在主機上創建數據。你不能用thrust::device_ptr來包裝一個像這樣創建的指針。它必須用於引用設備上的數據。 a不在設備上。下面的代碼編譯(並運行)乾淨,我在CUDA 6.5:

#include <thrust/extrema.h> 
#include <thrust/device_ptr.h> 


    struct Float3 {float x, y, z;}; 
    struct Comparator : public thrust::binary_function<Float3, Float3, bool> { 
    __host__ __device__ bool operator()(const Float3& a, const Float3& b) const 
    { 
     return a.x > b.x; 
    } 
    }; 

int main(){ 
    Float3 a[10]; 
    Float3 *d_a; 
    cudaMalloc(&d_a, 10*sizeof(Float3)); 
    cudaMemcpy(d_a, a, 10*sizeof(Float3), cudaMemcpyHostToDevice); 
    thrust::minmax_element(thrust::device_ptr<Float3>(d_a), 
         thrust::device_ptr<Float3>(d_a) + 10, 
         Comparator()); 
} 

注意,上面的代碼實際上將編譯沒有錯誤,即使你使用的a代替d_a(因爲它們都是原始指針,編譯時推力無法分辨)。但是a的使用是錯誤的,如果你嘗試運行它,代碼將會拋出一個錯誤。

+0

感謝您的回答。我找出問題所在。我最初在函數中定義了結構比較器。在將它移到該函數之外後,錯誤得到修復。 – user2621037 2014-10-05 14:19:47