我目前正在編寫一個程序,它挑出一個大的二維數組的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];
}
根據您的輸入大小以及posx和posy的大小,可能會採用不同的方法。你能提供這些的大致指標嗎?還有img的數據類型? –
posx和posy的範圍可以從0到1000,而loadszie的大小可以是數百。 Img是一個浮點數 – LukaK
爲了獲得最佳性能,您希望使用float4作爲寫入操作並根據目標硬件使用ImgInt的紋理或表面。其餘的,你的並行方法似乎非常合理。 –