Я пытался объявить функцию как __global__ friend void ...
в коде CUDA и не получил ни предупреждения IDE, ни ошибки компиляции рядом с объявлением функции, но я не смог использовать функцию из-за ошибки «необъявленный идентификатор». После некоторого поиска, я нашел документацию , описывающую ограничения функций друзей в CUDA, которая неявно намекнула, что я должен использовать friend __global__ void
.
Но я не нашел никакой информации о порядке ключевых слов в объявлении функций в документации CUDA, так что, возможно, этот вопрос касается не CUDA, а C ++.
Поэтому мне интересно, в каком порядке я должен размещать ключевые слова в объявлении функции / метода в коде C ++ / CUDA ?
РЕДАКТИРОВАТЬ:
Похоже, я был серьезно неправ, и есть независимо от того, , использую ли я friend __global__
или __global__ friend
- похоже, что ошибка моей IDE , коды с обоими порядками ключевых слов успешно скомпилированы
Пример кода:
class MyClass
{
public:
friend __global__ void get_field(const MyClass *m, int *return_value);
private:
int field;
};
__global__ void get_field(const MyClass *m, int *return_value)
{
*return_value = m->field;
}
int main()
{
MyClass m{};
int *d_field;
cudaMallocManaged((void **)&d_field, sizeof(int));
get_field<<<1, 1>>>(&m, d_field);
cudaFree(d_field);
}
Обновленный вопрос, который я хочу задать, следующий: есть ли в C ++ / CUDA ситуация, когда порядок ключевых слов имеет значение либо для успешной компиляции, либо для чего-то еще?