2016-05-05 52 views
2

我目前正在編寫一個程序,它挑出一個大的二維數組的2D塊並將它們放入一個較小的二維數組中。數組實際上被保存爲一維數組,但我認爲他們是二維數組,被理順了。現在,爲了循環,確保我在移動到大陣列的新部分之前取出大循環的Nx,Ny元素。在cuda中展開3個C++循環

我真的不知道如何在CUDA內核中更有效地執行此數據傳輸。如果我只是爲了相同大小的數組,我本可以做出解決方案。但是,在每個Nx * Ny元素之後我都會感到困惑。

下面是3個for循環,使所有這一切發生。 posx和posy包含需要減去起始位置的座標。

for (int i = 0; i < loadsize; i++) 
    { 
     for (int k = 0; k < Searchsizey; k++) 
     { 
      for (int l = 0; l < Searchsizex; l++) 
      { 
       img[count] = ImgInt[posx[i] - ImgStartx + (posy[i] - ImgStarty) * sizex + sizex*k + l]; 
       count++; 
      } 
     } 
    } 

的問題是,所述兩個內部循環運行到最大Searchsizex和Searchsizey的。如果我要在使用l和k作爲線索索引的內核中實現此功能,這些將比Searchsizex和Searchsizey更大。

我想過製作一個迭代槽的CUDA內核,但它看起來非常有效,可以這樣做。下面是我關於放入內核的內容,但我不太喜歡它。它唯一的「半平行」。

希望你對如何做到這一點有一些建議,謝謝!

int l = blockIdx.x*blockDim.x + threadIdx.x; 
int k = blockIdx.y*blockDim.y + threadIdx.y; 
     for (int i = 0; i < loadsize; i++){ 
      img[l + k*sizex + (i*sizex*sizey)] = ImgInt[posx[i] - ImgStartx + (posy[i] - ImgStarty) * sizex + sizex*k + l];   
     } 
+2

根據您的輸入大小以及posx和posy的大小,可能會採用不同的方法。你能提供這些的大致指標嗎?還有img的數據類型? –

+0

posx和posy的範圍可以從0到1000,而loadszie的大小可以是數百。 Img是一個浮點數 – LukaK

+1

爲了獲得最佳性能,您希望使用float4作爲寫入操作並根據目標硬件使用ImgInt的紋理或表面。其餘的,你的並行方法似乎非常合理。 –

回答

1

所以我想,因爲沒有更多的迴應這個線程我會用Florents評論作爲答案。

寫入需要是float4類型,並且根據目標硬件,紋理或表面數據類型應該用於ImgInt。

除此之外,並行的方法似乎非常合理。