2013-12-04 3 views
0

Я пишу ядро ​​CUDA и хочу, чтобы __restrict__ некоторые из моих параметров. Я получаю сообщение об ошибке:Почему я получаю сообщение об ошибке: «Ограничить» не разрешено?

"restrict" is not allowed

Разве это не разрешено для некоторых типов переменных? Для некоторых комбинаций параметров? Из-за некоторых флагов компилятора? Потому что я был озорным?

Упрощенное подпись ядро:

template <typename T> foo(
    const T a[], 
    __restrict__ SomeType b[], 
    const T c 
) { 
    /* etc. */ 
} 
+0

@BenC: Обновлен вопрос. – einpoklum

ответ

6

Вы можете использовать только __restrict__ на тип указателя. Это также единственный контекст, в котором имеет смысл __restrict__.

+11

Просто для усиления: '__restrict__ SomeType b []' не в порядке. 'SomeType __restrict__ b []' не в порядке. '__restrict__ SomeType * b' не в порядке. 'SomeType * __restrict__ b' в порядке. Для примера см. [Документация] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#restrict). –

+0

Итак, вы говорите, что если мне нужен «ограниченный» указатель на SomeType, я не могу использовать квадратную скобку для параметра? – einpoklum

+0

@einpoklum: Вы не можете изменить значение ссылки на массив (я не уверен, что это правильная терминология). То есть вы не можете выполнять какую-либо арифметику указателя на 'b', и она всегда будет указывать на одну и ту же точку в памяти. Вот почему проблема с псевдонимом не применяется к 'b'. Вы можете сделать указатель, указав адрес 'b'. Вы можете использовать '__restrict__' на этом новом указателе. –

Смежные вопросы