【发布时间】:2017-07-06 21:59:23
【问题描述】:
我正在尝试在方便的统一内存模型下实现函数与CUDA的动态绑定。在这里,我们有一个结构体 Parameters,其中包含一个成员函数指针 void (*p_func)()。
#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运行,即para->p_func = func_A,实际上设备和主机函数地址都是由函数地址在主人。相反,如果分配 2 运行,则地址都将成为设备 1。
__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("addr@host: %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("addr@device: %p\n", para->p_func);
run_on_device<<<1,1>>>(para);
cudaDeviceSynchronize();
run_on_host(para);
cudaFree(para);
return 0;
}
现在的问题是,在统一内存模型下,设备和主机上的函数指针是否可以分别指向正确的函数地址?
【问题讨论】:
-
在你的结构体中放置两个函数指针,一个指向主机,一个指向设备,并根据上下文调度适当的函数。
-
@RobertCrovella
-
@RobertCrovella 如果一个变量不起作用,请添加另一个!是的,这是一个切实可行的解决方案。
标签: cuda