在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;
}
雅感謝answering.Can你建議我如何使用推力填補了二維數組::填寫功能。實際上,我在全局內存中擁有20多個二維數組,這些內核都可以訪問我的內核函數。爲了減少我擁有的內核函數的數量,我使用了推力庫,並使用推力內置函數來代替它。 – user1891682
您是否閱讀過鏈接的推力快速入門指南?我可以用'thrust :: sequence'調用'thrust :: fill(d.begin(),d.end(),27);' –
是的。我嘗試過並獲得了Visual Studio中大多數推力代碼的輸出。但我沒有找到二維數組的任何代碼。 – user1891682