2013-01-07 31 views
0

我是新推力(cuda),我想做一些數組操作,但我沒有在互聯網上找到任何類似的例子。推力 - 如何使用我的陣列/數據 - 模型

我有以下兩個數組(2D):

a = { {1, 2, 3}, {4} } 
b = { {5}, {6, 7} } 

我想要的推力計算此陣:

c = { {1, 2, 3, 5}, {1, 2, 3, 6, 7}, {1, 2, 3, 5}, {1, 2, 3, 6, 7} } 

我知道它是如何工作在C/C++而不是怎麼說的推力去做吧。

這是我知道這是怎麼沃爾也許可以工作:

主題1: 乘坐[0] - >用b展開。 將其寫入c。

線程2: 做一個[1] - >用b展開它。 將其寫入c。

但我不知道該怎麼做。我可以寫數組a和b的一維數組,如:

thrust::device_vector<int> dev_a; 
dev_a.push_back(3); // size of first array 
dev_a.push_back(1); 
dev_a.push_back(2); 
dev_a.push_back(3); 
dev_a.push_back(1); // size of secound array 
dev_a.push_back(4); 

thrust::device_vector<int> dev_b; 
dev_b.push_back(1); // size of first array 
dev_b.push_back(5); 
dev_b.push_back(2); // size of secound array 
dev_b.push_back(6); 
dev_b.push_back(7); 

和僞功能:

struct expand 
{ 
    __host__ __device__ 
    ?? ?? (const array ai, const array *b) { 
     for bi in b: // each array in the 2d array 
     { 
      c.push_back(bi[0] + ai[0]); // write down the array count 

      for i in ai: // each element in the ai array 
      c.push_back(i); 

      for i in bi: // each element in the bi array 
      c.push_back(i); 
     } 
    } 
}; 

任何人任何想法?

回答

1

我猜這樣的操作在GPU上不會得到任何的速度提升,因爲它需要大量的內存訪問 - 在GPU上緩慢的操作。

但是如果你無論如何要實現這一點:

  1. 我想,對於原因,我以前寫的,信任不會幫你準備使用的算法。這意味着你需要編寫你自己的內核,但是,你可以留下內存管理。

  2. 在CPU內存中創建數組總是更快,並在準備好時將整個數組複製到GPU。 (CPU <-> GPU副本在更長的數據段上速度更快)

  3. 請記住GPU並行運行數百個線程。每個線程都需要知道要讀什麼以及在哪裏寫。

  4. 全局內存操作很慢(300-400個時鐘)。避免線程從全局內存中讀取整個數組,以發現它只需要最後幾個字節。

所以,我可以看到你的程序。

  1. 請在CPU存儲器您的陣列1D看起來像這樣:

    浮子ARRAY1 [] = {1,2,3,4}; float array2 [] = {5,6,7}; int arr1offsets [] = {0,2,3,1}; //第一個元素的位置和子陣列對的長度 int arr2offsets [] = {0,1,1,2};

  2. 將陣列和偏移複製到GPU併爲結果和偏移分配內存。我想,你必須計算一個聯合子陣列的最大長度併爲最壞情況分配內存。

  3. 運行內核。

  4. 收集結果

內核可能看起來像這樣(如果我理解正確你的想法)

__global__ void kernel(float* arr1, int* arr1offset, 
         float* arr2, int* arr2offset, 
         float* result, int* resultoffset) 
{ 
    int idx = threadIdx.x+ blockDim.x*blockIdx.x; 
    int a1beg = arr1offset[Idx*2]; 
    int a2beg = arr2offset[Idx*2]; 
    int a1len = arr1offset[Idx*2+1]; 
    int a2len = arr2offset[Idx*2+1]; 
    resultoffset[idx*2] = idx*MAX_SUBARRAY_LEN; 
    resultoffset[idx*2+1] = a1len+a2len; 

    for (int k = 0; k < a1len; ++k) result[idx*MAX_SUBARRAY_LEN+k] = arr1[a1beg+k]; 
    for (int k = 0; k < a2len; ++k) result[idx*MAX_SUBARRAY_LEN+a1len+k] = arr2[a2beg+k]; 
} 

此代碼是不完美的,但應該做的正確的事情。

+0

P.S.如果有人知道,如何在兩個列表項之間製作這種電路板格式代碼 - 請更正。 –

+0

謝謝你的幫助。我會試試看。 如果有人知道陣列讀/寫多線程的另一種方式 - 請告訴我們。 ;) – nt2005