2009-06-26 87 views

回答

16

我找到了解決這個問題的方法。我不必將陣列弄平。

內置的cudaMallocPitch()功能完成了這項工作。我可以使用cudaMemcpy2D()函數將數組傳輸到設備和從設備傳輸數組。

例如

cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b); 

這產生大小的2D陣列A * B與作爲傳遞作爲參數的音高。

以下代碼將創建一個2D數組並循環遍歷這些元素。它很容易編譯,你可以使用它。

#include<stdio.h> 
#include<cuda.h> 
#define height 50 
#define width 50 

// Device code 
__global__ void kernel(float* devPtr, int pitch) 
{ 
    for (int r = 0; r < height; ++r) { 
     float* row = (float*)((char*)devPtr + r * pitch); 
     for (int c = 0; c < width; ++c) { 
      float element = row[c]; 
     } 
    } 
} 

//Host Code 
int main() 
{ 

float* devPtr; 
size_t pitch; 
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height); 
kernel<<<100, 512>>>(devPtr, pitch); 
return 0; 
} 
+0

稍後可以爲數組分配一個新行嗎? – scatman 2011-04-12 06:08:32

3

展平:使其成爲一維。看看它是如何完成的here

2

您的設備代碼可能會更快。嘗試使用更多的線程。

__global__ void kernel(float* devPtr, int pitch) 
{ 
    int r = threadIdx.x; 

    float* row = (float*)((char*)devPtr + r * pitch); 
    for (int c = 0; c < width; ++c) { 
     float element = row[c]; 
    } 
} 

然後,您計算適當的塊和線程分配,以便每個線程處理單個元素。

+0

Gitmo發佈的代碼是來自文檔的無用示例。是的,你的版本更快,但是你如何在行和列上並行執行此操作?嚴格地說,你可能會在你的手中亂七八糟,因爲你不檢查「r」是否小於實際的行數 – pelesl 2014-06-19 00:25:47