CUDA: Come applicare __Restrict__ su array di puntatori agli array?
-
29-10-2019 - |
Domanda
Questo kernel usando due __restrict__
Gli array int compila bene:
__global__ void kerFoo( int* __restrict__ arr0, int* __restrict__ arr1, int num )
{
for ( /* Iterate over array */ )
arr1[i] = arr0[i]; // Copy one to other
}
Tuttavia, gli stessi due array int composti in un array di punta non riesce la compilazione:
__global__ void kerFoo( int* __restrict__ arr[2], int num )
{
for ( /* Iterate over array */ )
arr[1][i] = arr[0][i]; // Copy one to other
}
L'errore fornito dal compilatore è:
error: invalid use of `restrict'
Ho alcune strutture che sono composte come una matrice di puntatori agli array. (Ad esempio, una struttura è passata al kernel che ha int* arr[16]
.) Come li passo ai kernel ed essere in grado di applicare __restrict__
su di essi?
Soluzione
Il manuale CUDA C si riferisce solo alla definizione C99 __restrict__
, nessuna particolare circostanza specifica per Cuda.
Poiché il parametro indicato è un array contenente due puntatori, questo uso di __restrict__
Mi sembra perfettamente valido, nessun motivo per il compilatore di lamentarsi di IMHO. Chiederei all'autore del compilatore di verificare e possibilmente/probabilmente correggere il problema. Tuttavia, sarei interessato a opinioni diverse.
Un'osservazione a @talonmies:
Il punto centrale di limitare è dire al compilatore che due o più argomenti di punta non si sovrappongono mai in memoria.
Questo non è strettamente vero. restrict
Dice al compilatore che il puntatore in questione, per la durata della sua vita, è l'unico puntatore attraverso il quale è possibile accedere all'oggetto a punta. Sii consapevole che l'oggetto indicato è solo presunto essere una serie di int
. (In verità è solo uno int
In questo caso.) Poiché il compilatore non può conoscere le dimensioni dell'array, dipende dal programmatore per proteggere i confini dell'array.