PyCUDA: Pow внутри кода устройства пытается использовать std :: pow, не работает - PullRequest
4 голосов
/ 14 апреля 2011

Вопрос более или менее говорит сам за себя.

calling a host function("std::pow<int, int> ") from a __device__/__global__ function("_calc_psd") is not allowed

Насколько я понимаю, вместо этого следует использовать функцию cuda pow, но это не так.

1 Ответ

6 голосов
/ 14 апреля 2011

Ошибка в точности соответствует сообщению компилятора. Вы не можете использовать функции хоста в коде устройства, и это включает в себя всю библиотеку C ++ std хоста. CUDA включает в себя собственную стандартную библиотеку, описанную в руководстве по программированию, но вы должны использовать либо pow, либо fpow (взято из стандартной библиотеки C, без C ++ или пространств имен). nvcc перегрузит функцию с помощью правильной функции устройства и вставит полученный код. Будет работать что-то вроде следующего:

#include <math.h>

__device__ float func(float x) {

   return x * x * fpow(x, 0.123456f);
}

РЕДАКТИРОВАТЬ: Бит, который я пропустил в первый раз, - это спецификатор шаблона, указанный в ошибках. Вы уверены, что передаете либо аргументы типа float, либо double аргументы в pow? Если вы передаете целые числа, в стандартной библиотеке CUDA нет функции перегрузки, поэтому может произойти сбой. Если вам нужна целочисленная функция pow, вам придется выполнить свою собственную (или выполнить приведение, но функция pow довольно дорогая, и я уверен, что некоторое каскадное целочисленное умножение будет быстрее).

...