【发布时间】:2020-02-14 17:23:35
【问题描述】:
我一直在思考这个问题的答案:
How to pass device function as an input argument to host-side function?
尤其是 Robert Crovella 的 answer。我不太明白为什么需要中间全局符号。也就是说,为什么会这样:
#include <stdio.h>
__device__ int f1(){ printf("dev f1\n"); return 0;}
__device__ void *fptrf1 = (void*) f1;
__global__ void mykernel(int (*fptr)()) {
fptr();
printf("executed\n");
}
int main() {
void *hf1;
cudaMemcpyFromSymbol(&hf1, fptrf1, sizeof(int *));
mykernel<<<1,1>>>((int (*)())hf1);
cudaDeviceSynchronize();
}
但这不起作用:
#include <stdio.h>
__device__ int f1(){ printf("dev f1\n"); return 0;}
__global__ void mykernel(int (*fptr)()) {
fptr();
printf("executed\n");
}
int main() {
void *hf1;
cudaMemcpyFromSymbol(&hf1, f1, sizeof(int *));
mykernel<<<1,1>>>((int (*)())hf1);
cudaDeviceSynchronize();
}
?我的意思是,函数不是符号吗?如果全局指针的设备端地址可以被我的主机端代码“知道”,为什么函数本身不能呢? 如果它不起作用 - 为什么它会编译而不是抱怨?
【问题讨论】:
-
“我的意思是,函数不是符号吗?” -- 在这种情况下它不是