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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top