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

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

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

Ответы на вопрос(4)

ле:

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

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

rand ()', но некоторые функции хоста, такие как "printf", доступны при компиляции с совместимостью вычислений> = 2.0

например:

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

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

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

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

Решение Вопроса

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

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

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

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

 avgvstvs14 нояб. 2016 г., 17:16
Означает ли это, что хост и устройство будут выполнять только свои собственные соответствующие копии функций?
 Mattia20 апр. 2016 г., 17:04
Насколько плохо снижение производительности при вызове функции хоста вместо использования встроенной cuda?

Ваш ответ на вопрос