2013-07-23 69 views
1

當我運行這段代碼時,編譯器說我正在從設備調用一個主機函數。我不太明白如何。如何在cuda內核中調用推力函數

__global__ void kernel(thrust::device_vector<float*> d_V) { 

     float *var = d_V[0]; 
    } 

    int main() { 

     thrust::host_vector<float*> V; 
     thrust::host_vector<float*> d_V; 

     float f[10]; 
     for (int i = 0; i < 10; i++) { 
      f[i] = i; 
     } 
     V.push_back(f); 
     d_V = V; 
     kernel<<<1, 1>>>(d_V); 

     return 0;  
    } 

回答

3

推力功能/方法被設計用於主機(CPU)側。它們不能在CUDA內核的設備(GPU)端被調用。

您在代碼中演示的內容實際上是將一些數據傳遞給內核。數據可以被內核參數列表中除推力容器以外的原始指針引用。

__global__ void kernel(float* p) 
{ 
    float *var = p; 
} 

int main() 
{ 
    thrust::device_vector<float> d_v(
     thrust::make_counting_iterator((float)0), 
     thrust::make_counting_iterator((float)0)+10); 
    kernel<<<1,1>>>(thrust::raw_pointer_cast(&d_v[0])); 
} 
+1

此外,代碼還有各種其他問題。原始代碼將'd_V'聲明爲'host_vector',這可能只是一個簡單的錯誤。但更重要的是,原始代碼處理指針向量。這在設備代碼中處理肯定會有問題。 –