PyCUDA: Pow в коде устройства пытается использовать std::pow, сбой

#python #cuda #pow #pycuda

#python #cuda #pow #pycuda

Вопрос:

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

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

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

Ответ №1:

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

 #include <math.h>

__device__ float func(float x) {

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

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