2013-03-28 44 views
2

我是使用推力庫的新手。我有我的CUDA C代碼,它使用全局2D數組。我在我的代碼中使用內核函數初始化它。是否有可能在CUDA中使用推力庫的2D陣列使用thrust :: device_vector和thrust :: fill

我必須知道是否可以使用thrust::device_vectorthrust::fill來初始化和填充2D數組。

例如:

// initialize 1D array with ten numbers in a device_vector 
    thrust::device_vector<int> D(10); 

是否有可能給..

thrust::device_vector<int> D[5][10]; 

,如果它可能會如何我使用thrust::fill功能。

我的目標是使用推力庫優化代碼。

回答

3

在STL和推力中,vector是一個數據元素的容器,遵循嚴格的線性序列,因此它基本上是一維的。在推力中,這些數據元素可以是普通類型,甚至是結構體和對象,但它們不能是其他向量(與STL不同)。

您可以創建一個向量數組,但對它們的推力操作通常需要在數組中的每個向量上逐個完成。

關於語法,你不能做到這一點:

thrust::device_vector D[5][10]; 

你可以做這樣的事情:

thrust::device_vector<int> D[5][10]; 

然而,這將創造載體的2-d陣列,這是不你想要什麼,我不認爲。

在很多情況下,二維陣列可以被「扁平化」以便像處理一維一樣進行處理,並且在不瞭解情況的情況下,我建議您進行調查。例如,如果您可以像使用指針索引一維對待您的二維數組,那麼您可以使用單一的thrust :: fill調用填充整個事物。

我也推薦熟悉推力quick start guide

這裏是表示基本的扁平化主機上的二維陣列的工作例如:

#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/sequence.h> 

#define H 5 
#define W 10 
__global__ void kernel(int *data, int row, int col) { 

    printf("Element (%d, %d) = %d\n", row, col, data[(row*W)+col]); 

} 

int main(void) 
{ 
    int h[H][W]; 
    thrust::device_vector<int> d(H*W); 

    thrust::copy(&(h[0][0]), &(h[H-1][W-1]), d.begin()); 
    thrust::sequence(d.begin(), d.end()); 
    kernel<<<1,1>>>(thrust::raw_pointer_cast(d.data()), 2, 3); 
    cudaDeviceSynchronize(); 

    return 0; 
} 
+0

雅感謝answering.Can你建議我如何使用推力填補了二維數組::填寫功能。實際上,我在全局內存中擁有20多個二維數組,這些內核都可以訪問我的內核函數。爲了減少我擁有的內核函數的數量,我使用了推力庫,並使用推力內置函數來代替它。 – user1891682

+0

您是否閱讀過鏈接的推力快速入門指南?我可以用'thrust :: sequence'調用'thrust :: fill(d.begin(),d.end(),27);' –

+0

是的。我嘗試過並獲得了Visual Studio中大多數推力代碼的輸出。但我沒有找到二維數組的任何代碼。 – user1891682

相關問題