Pregunta

Este núcleo usando dos __restrict__ int las matrices se compila bien:

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

Sin embargo, las mismas dos matrices int compuestas en una matriz de puntero falla compilación:

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

El error dado por el compilador es:

error: invalid use of `restrict'

Tengo ciertas estructuras que están compuestas como una variedad de punteros para matrices. (Por ejemplo, una estructura pasó al núcleo que ha int* arr[16].) ¿Cómo los paso a los núcleos y puedo aplicar __restrict__ ¿en ellos?

¿Fue útil?

Solución

El manual de Cuda C solo se refiere a la definición de C99 de __restrict__, sin circunstancias especiales específicas de CUDA.

Dado que el parámetro indicado es una matriz que contiene dos punteros, este uso de __restrict__ Me parece perfectamente válido, no hay razón para que el compilador se queje en mi humilde opinión. Le pediría al autor del compilador que verifique y posiblemente/probablemente corrija el problema. Sin embargo, me interesaría diferentes opiniones.

Un comentario a @Talonmies:

El objetivo de restringir es decirle al compilador que dos o más argumentos de puntero nunca se superponen en la memoria.

Esto no es estrictamente cierto. restrict le dice al compilador que el puntero en cuestión, durante la duración de su vida, es el único puntero a través del cual se puede acceder al objeto puntiagudo. Tenga en cuenta que el objeto señalado es solo ficticio ser una matriz de int. (En verdad es solo uno int En este caso.) Dado que el compilador no puede saber el tamaño de la matriz, depende del programador proteger los límites de la matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top