CUDA:配列にポインターの配列に__Restrict__を適用するにはどうすればよいですか?
-
29-10-2019 - |
質問
2つを使用したこのカーネル __restrict__
intアレイは正常にコンパイルされます:
__global__ void kerFoo( int* __restrict__ arr0, int* __restrict__ arr1, int num )
{
for ( /* Iterate over array */ )
arr1[i] = arr0[i]; // Copy one to other
}
ただし、ポインターアレイに構成された同じ2つの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__
それらの上に?
解決
CUDA Cマニュアルは、のC99定義のみを指します __restrict__
, 、特別なCUDA固有の状況はありません。
示されたパラメーターは2つのポインターを含む配列であるため、この使用 __restrict__
私にとって完全に有効に見えます。コンパイラーが私見を不平を言う理由はありません。コンパイラの著者に、問題を検証し、おそらく修正するように依頼します。しかし、私はさまざまな意見に興味があります。
@talonmiesへの1つの発言:
の全体のポイント 制限 2つ以上のポインター引数がメモリに重複しないことをコンパイラに伝えることです。
これは厳密に真実ではありません。 restrict
コンパイラに、問題のポインターは、その寿命の期間中、尖ったオブジェクトにアクセスできる唯一のポインターであることを伝えます。指摘されているオブジェクトはのみであることに注意してください 想定されています の配列になる int
. 。 (実際には、1つだけです int
この場合。)コンパイラは配列のサイズを知ることができないため、配列の境界を守るのはプログラマー次第です。
所属していません StackOverflow