2011-12-07 33 views
2

這個內核使用兩個__restrict__ INT陣列編譯罰款:CUDA:如何將__restrict__應用於數組指針?

__global__ void kerFoo(int* __restrict__ arr0, int* __restrict__ arr1, int num) 
{ 
    for (/* Iterate over array */) 
     arr1[i] = arr0[i]; // Copy one to other 
} 

但是,組合成一個指針數組相同的兩個int陣列失敗編譯:

__global__ void kerFoo(int* __restrict__ arr[2], int num) 
{ 
    for (/* Iterate over array */) 
     arr[1][i] = arr[0][i]; // Copy one to other 
} 

由編譯器給定的錯誤是:

error: invalid use of `restrict' 

我有某些結構組成的指針數組指針。 (例如,一個結構傳遞給具有int* arr[16]內核。)我如何把它們傳遞給內核,並能夠對它們應用__restrict__

+0

'__restrict__'確實對指針非常有用,但'int * arr [2]'實際上是一個數組,如果兩個點。我認爲,它不適用於主機代碼... – Yappie

+0

限制是真的讓你獲得一些性能優勢? – Yappie

+4

'__restrict__'的第二次使用完全沒有意義。 '__restrict__'的要點是告訴編譯器兩個或更多的指針參數不會在內存中重疊。在這種情況下,你沒有兩個指針參數,所以'__restrict__'不適用。 – talonmies

回答

2

的CUDA C手冊只指__restrict__ C99的定義,沒有什麼特別具體的CUDA-情況。

由於指示的參數是一個包含兩個指針的數組,因此__restrict__的使用對我來說看起來完全有效,沒有理由讓編譯器抱怨恕我直言。我會要求編譯器作者驗證並可能/可能更正問題。不過,我會對不同的意見感興趣。

一個驚人之語@talonmies:

整點限制就是告訴兩個或更多的指針參數將永遠在記憶重疊的編譯器。

這並不完全正確。 restrict告訴編譯器,有問題的指針在其生命期內是唯一可以訪問指向對象的指針。請注意,指向的對象僅僅是假設是的int數組。 (事實上​​,在這種情況下它只有一個int)。由於編譯器無法知道數組的大小,因此程序員必須保護數組的邊界。