2011-12-07 18 views
2

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 
} 

しかし、同じ2つの整数アレイが構成されるポインタ配列は、コンパイル失敗に:

__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] 'は実際には2点の配列です。私は、それはホストコードのために動作しないと思う... – Yappie

+0

制限は本当にあなたにいくつかのパフォーマンスの利点を得るのですか? – Yappie

+4

'__restrict__'の2度目の使用は絶対に意味がありません。 '__restrict__'の全体のポイントは、2つ以上のポインタ引数がメモリ内で重複しないことをコンパイラに伝えることです。その場合、2つのポインタ引数がないので、 '__restrict__'は適用されません。 – talonmies

答えて

2

CUDA Cマニュアルでは、C99の定義が__restrict__であり、特別なCUDA固有の状況はありません。

指示されたパラメータは2つのポインタを含む配列なので、__restrict__のこの使用は完全に有効です。コンパイラがIMHOに不平を言う理由はありません。私は、コンパイラの作成者に、問題を検証し、場合によっては/おそらく/おそらく修正するように依頼します。私は、しかし、異なる意見に興味があるだろう。 @talonmiesへ

一つの発言:

の全体のポイントは、を制限する二つ以上のポインタ引数は、メモリ内で重複することはありませんコンパイラに伝えることです。

これは厳密には当てはまりません。 restrictは、そのポインタがその存続期間中、指し示されたオブジェクトにアクセスできる唯一のポインタであることをコンパイラに知らせます。指示されたオブジェクトはと仮定され、intの配列であると仮定されていることに注意してください。コンパイラは配列の大きさを知ることができないので、配列の境界を保護するのはプログラマの責任です。