При компиляции приведенного ниже кода с помощью nvcc (CUDA 5.0) появляется ошибка "недопустимая комбинация квалификаторов памяти", так как, видимо, невозможно иметь глобальные ядра в классе.
class A
{
public:
__global__ static void kernel();
};
__global__ void A::kernel()
{}
Я могу понять это ограничение при работе с нестатическими членами, но почему ошибка все еще возникает, когда ядро объявлено статическим? Вызов таких членов ничем не отличается от вызова функции, когда она объявлена в пространстве имен (в данном случае A
).
A::kernel <<< 1, 1 >>> ();
Есть ли причина, по которой я не понимаю, почему это не реализовано (пока)?
EDIT: Судя по ответам как в ответах, так и в комментариях, я недостаточно ясно выразил свой вопрос. Мой вопрос не в том, почему появляется ошибка. Очевидно, это потому, что он не был реализован. Мой вопрос заключается в том, почему это не реализовано. До сих пор я не мог придумать причину, по которой эта функция не может быть реализована. Я понимаю, что мог забыть об особом случае, который усложнил бы дело, отсюда и вопрос.
Причины, по которым я считаю это разумной функцией, следующие:
- Статическая функция не имеет указателя
this
. Таким образом, даже если ядро вызывается для объекта, который находится на хосте, нет конфликта при доступе к его данным, так как эти данные изначально недоступны (данные из какого объекта? ?). - Вы можете возразить, что если у класса есть связанные с ним статические данные, живущие на хосте, они в принципе должны быть доступны из статического ядра. Однако статические данные также не поддерживаются, так что опять же нет конфликта.
- Вызов статического ядра для объекта на хосте (
A a; a.staticKernel<<<...,...>>>();)
) был бы полностью эквивалентен вызову его вообще без объекта (A::staticKernel<<<...,...>>>();
), как мы привыкли в обычном C++.
Что мне не хватает?