#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 — довольно дорогая функция, и я уверен, что некоторое каскадное умножение целых чисел будет быстрее).