Я пытаюсь реализовать динамическое связывание функций с CUDA под удобной унифицированной моделью памяти. Здесь у нас есть структура Параметры, содержащие элемент, указатель функции void (* p_func)().Назначение указателя функции с унифицированной памятью в CUDA
#include <cstdio>
struct Parameters {
void (*p_func)();
};
структура управляется единой памяти и мы относим фактическую функцию func_A к p_func.
__host__ __device__
void func_A() {
printf("func_A is correctly invoked!\n");
return;
}
Когда мы проходим через следующий код, возникает проблема: если задание 1 работает, то есть, пара-> p_func = func_A, оба устройства и хост-адрес функции фактически назначается адрес функции на хост. В отличие от этого, если назначение 2 работает, адреса становятся одним из устройств.
__global__ void assign_func_pointer(Parameters* para) {
para->p_func = func_A;
}
__global__ void run_on_device(Parameters* para) {
printf("run on device with address %p\n", para->p_func);
para->p_func();
}
void run_on_host(Parameters* para) {
printf("run on host with address %p\n", para->p_func);
para->p_func();
}
int main(int argc, char* argv[]) {
Parameters* para;
cudaMallocManaged(¶, sizeof(Parameters));
// assignment 1, if we uncomment this section, p_func points to address at host
para->p_func = func_A;
printf("[email protected]: %p\n", para->p_func);
// assignment 2, if we uncomment this section, p_func points to address at device
assign_func_pointer<<<1,1>>>(para); //
cudaDeviceSynchronize();
printf("[email protected]: %p\n", para->p_func);
run_on_device<<<1,1>>>(para);
cudaDeviceSynchronize();
run_on_host(para);
cudaFree(para);
return 0;
}
Вопрос теперь в том, возможно ли это для указателей на функции в устройстве и точку хоста на правильные адреса функций, соответственно, в рамках единой модели памяти?
Поместите два указателя функций в свою структуру, один для хоста, один для устройства и отправьте соответствующую функцию на основе контекста. –
@RobertCrovella – user2220640
@RobertCrovella Если одна переменная не работает, добавьте еще одну! Да, это решение, которое практически работает. – user2220640