2013-09-01 33 views
0
__global__ 
void transpose(double *input, double *output, int *width, int *height) 
{ 
    int threadidx = (blockIdx.x * blockDim.x) + threadIdx.x; 
    int row = threadidx/(*width); 
    int column = (threadidx+3) % (*height); 
    output[column * (*height) + row] = input[threadidx]; 
} 

上面是我的線性變換的核心。對於[0,1,2,3,4,5,6,7,8]的輸入矩陣,輸出矩陣應該是[0,3,6,1,4,7,2,5,8],但是當我使用上述示例運行此代碼時,輸​​出爲[0,3,6,0,0,0,0,0,0]。我已經用Python編寫了該算法的串行實現,並且它可以工作。我唯一能想到的是某種線程內存訪問問題。任何幫助?謝謝。簡單的線性變換算法不起作用

+1

錯誤發生在您未向我們顯示的代碼中。請編輯您的問題,以包含最短可能的完整示例來說明問題。 – talonmies

+0

嘗試使用cuda-memcheck。但我用上面的代碼嘗試了它的工作正常。上面的代碼沒有問題。你可能想要顯示完整的代碼來幫助。 –

+0

如果您必須進行並行轉換,我記得CUDA SDK包含一個「轉置」示例。 – JackOLantern

回答

1

正如評論已經指出的那樣,你的代碼恰好爲你鑑定的樣品輸入情況下正常工作:

[0, 1, 2, 3, 4, 5, 6, 7, 8] 

如果你沒有得到你指出的結果,那麼誤差你已經顯示的代碼之外。但是,看起來你正在嘗試轉置一個數組。

此代碼不能用於一般情況下工作(如嘗試一個2x2的陣列:[0, 1, 2, 3]

的特別是這行代碼是不正確的,如果你的目的是要轉一個數組:

int column = (threadidx+3) % (*height); 

如果將其更改爲:

int column = (threadidx) % (*width); 

您的代碼會產生各種矩陣大小正確的結果轉。