CUDA: Как применить __restrict__ к массиву указателей на массивы? - PullRequest
3 голосов
/ 07 декабря 2011

Это ядро, использующее два массива __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
}

Однако, те же два массива 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__?

1 Ответ

2 голосов
/ 14 декабря 2011

Руководство CUDA C относится только к определению C99 __restrict__, без особых особых обстоятельств CUDA.

Поскольку указанный параметр является массивом, содержащим два указателя, такое использование __restrict__ выглядит для меня вполне допустимым, и компилятор не будет жаловаться на IMHO. Я бы попросил автора компилятора проверить и, возможно / возможно, исправить проблему. Хотя меня интересуют разные мнения.

Одно замечание к @talonmies:

Смысл restrict состоит в том, чтобы сообщить компилятору, что два или более аргумента указателя никогда не будут перекрываться в памяти.

Это не совсем верно. restrict сообщает компилятору, что рассматриваемый указатель на время его существования является единственным указателем, через который можно получить доступ к указанному объекту. Имейте в виду, что указанный объект только предполагается, что является массивом int. (На самом деле это только один int в этом случае.) Поскольку компилятор не может знать размер массива, программист должен охранять границы массива.

...