Проблема с указателями на функции в CUDA - PullRequest
1 голос
/ 16 марта 2012

Мне очень трудно найти проблему в моем коде.Я пытаюсь передать указатель функции на графический процессор для выполнения ядром, но по какой-то причине все это не удается.Вот мое объявление:

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, если он указывает на функцию устройства, работает, но если я пытаюсь скопироватьСбой функции хоста.

Я уверен, что это какая-то глупая ошибка, которую я не могу обнаружить.Спасибо за вашу помощь.

1 Ответ

1 голос
/ 16 марта 2012

Это только что произошло со мной, может стоит попробовать.Объявите функции, которые вы хотите передать как функции устройства.Дайте каждому из них указатель на функцию устройства, как вы сделали для f.Вызовите

cudaMemcpyToSymbol(d_map, &<function of choice>, sizeof(d_map), 0, cudaMemcpyDeviceToDevice)

Поскольку вы копируете память, выделенную на вашем устройстве, размер указателя функции должен соответствовать.

Это полностью не проверено.Это может убить вашу карту.

...