Мне очень трудно найти проблему в моем коде.Я пытаюсь передать указатель функции на графический процессор для выполнения ядром, но по какой-то причине все это не удается.Вот мое объявление:
typedef void* (*map_func)(void* p);
__device__ void* f(void* param)
{
int value = (intptr_t)param;
return (void*)(value * value * value);
}
__device__ map_func d_map = f;
Обратите внимание на присвоение f
.Это должно доказать, что вызов указателя функции с помощью функции устройства работает.
В ядре, которое я вызываю d_map
.На хосте я объявляю и копирую указатель на функцию:
void* square(void* param)
{
int value = (intptr_t)param;
return (void*)(value * value);
}
...
map_func h_map = square;
cudaMemcpyToSymbol(d_map, &h_map, sizeof(map_func));
Однако, когда я выполняю ядро, я получаю unspecified launch failure
, что, как я подозреваю, означает ошибку сегмента.Я протестировал код возврата cudaMemcpyToSymbol
, и он успешен.
В итоге : вызов d_map
, если он указывает на функцию устройства, работает, но если я пытаюсь скопироватьСбой функции хоста.
Я уверен, что это какая-то глупая ошибка, которую я не могу обнаружить.Спасибо за вашу помощь.