Подтвердить что ты не робот

Как вызвать функцию хоста в ядре CUDA?

Как следует из следующей ошибки, вызов функции хоста ('rand') не разрешен в ядре, и я задаюсь вопросом, есть ли решение для него, если мне это нужно.

error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed
4b9b3361

Ответ 1

К сожалению, вы не можете вызывать функции на устройстве, которые не указаны с помощью модификатора __device__. Если вам нужны случайные числа в коде устройства, посмотрите на случайный генератор cuda curand http://developer.nvidia.com/curand

Если у вас есть собственная функция хоста, которую вы хотите вызвать из ядра, используйте в нем модификаторы __host__ и __device__:

__host__ __device__ int add( int a, int b )
{
    return a + b;
}

Когда этот файл скомпилирован драйвером компилятора NVCC, скомпилируются две версии функций: один из них может быть указан хост-кодом, а другой - кодом устройства. И именно поэтому эту функцию теперь можно назвать как хостом, так и кодом устройства.

Ответ 2

Короткий ответ заключается в том, что здесь нет решения этой проблемы.

Все, что обычно работает на процессоре, должно быть адаптировано для среды CUDA без каких-либо гарантий, что это возможно. Функции хоста - это просто другое имя в CUDA для обычных функций C. То есть, функции, выполняемые на архитектуре центрального процессора Von Neumann, как и все C/С++, до сих пор были на ПК. Графические процессоры дают вам огромное количество вычислительной мощности, но стоимость в том, что она не так гибка или совместима. Самое главное, что функции работают без возможности доступа к основной памяти, а доступная им память ограничена.

Если вы пытаетесь получить генератор случайных чисел, вам повезло, учитывая, что Nvidia столкнулась с проблемой специально внедрить высокоэффективный Mersenne Twister, который может поддерживать до 256 потоков на SMP. Он может быть вызван внутри функции устройства, описанной в более раннем сообщении моей здесь. Если кто-то найдет лучшую ссылку, описывающую эту функциональность, удалите мою и замените соответствующий текст здесь вместе со ссылкой.

Одна вещь, которую я постоянно удивляю, заключается в том, сколько программистов, похоже, не знают о стандартизированных генераторах псевдослучайных чисел высокого качества. "Роллинг свой" - это действительно не очень хорошая идея, учитывая, сколько из произведений искусства псевдослучайных чисел. Проверка генератора как обеспечение приемлемо непредсказуемых чисел требует большой работы и академического таланта...

Ответ 3

Хотя это не относится к 'rand()', но при компиляции с совместимостью вычислений >= 2.0

доступно несколько функций хоста, таких как printf,

например:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\...
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed

Компилирует и работает с sm_20, compute_20

Ответ 4

Я должен не согласиться с некоторыми другими ответами в следующем смысле:

OP не описывает проблему: не прискорбно, что вы не можете вызывать функции __host__ из кода устройства - совершенно невозможно, чтобы это было другим способом, и это не плохо вещь.

Объяснить: подумайте о коде хоста (CPU), таком как CD, который вы положили в CD-плеер; и на коде устройства, например, на SD-карте, которую вы положили в миниатюрный музыкальный плеер. Вопрос OP: "Как я могу засунуть диск в мой миниатюрный музыкальный плеер"? Вы не можете, и это не имеет смысла хотеть. Это может быть одна и та же музыка (код с одинаковой функциональностью, хотя обычно код хоста и код устройства не выполняют совершенно ту же вычислительную задачу), но носители не являются взаимозаменяемыми.