CUDA:如何将设备功能从主机添加到Device中声明的数组?

时间:2015-07-29 14:42:24

标签: cuda gpu function-pointers host memory-address

我在main()之前定义了几个设备函数,我想用这些函数填充全局内存中的数组,以便任何内核都可以访问它们。 我知道我可以直接声明一个静态的设备数组[]并用各种函数填充它但这不是我想要的,因为它意味着它是硬编码的,我想让它尽可能简单为用户。所以我更喜欢避免硬编码,我想让用户可以从主机添加他/她需要的功能。 因此,我一直在设备和主机中使用函数指针,这就是我遇到的问题。这是我想要做的一个例子,但这不起作用:

typedef void (*ptrfunction)(int &, int &);



// Example of possible device functions:

__device__ void add(int &type1, int &type2){

// Do something
}


__device__ void multiply(int &type1, int &type2){

// Do something
}


__device__ void divide(int &type1, int &type2){

// Do something
}


// Array to be filled with these functions
__device__ ptrfunction listfunctions[10];



// Function pointers in the Device

// IMPORTANT: The following function pointer is not pointing to anything at this moment
__device__ ptrfunction devfunc;

// Function pointer that do point to a function:
__device__ ptrfunction devptr = multiply;



int main(){

ptrfunction hostptr;


// What I would like: A function that allows the user to add the different device functions he wants here.
// Something like:

AddFunction(add);
AddFunction(multiply);
....

AddFunction应以某种方式用add,multiply等填充设备中声明的数组列表函数... 这里的问题是如何从主机访问这些设备功能并将它们传递给设备? 我尝试的第一件事是直接使用cudaMemcpyFromSymbol将添加或乘法设备函数复制到函数指针devfunc,如下所示,以为我可以直接从任何内核使用devfunc:

cudaMemcpyToSymbol(devfunc, multiply, sizeof(pf_interacts), 0, cudaMemcpyHostToDevice);

它不编译:  错误:没有重载函数的实例" cudaMemcpyToSymbol"匹配参数列表

我尝试使用设备中声明的int来实现cudaMemcpyToSymbol,它运行正常。但是当涉及到函数指针时,有些东西不起作用。

一个有效但我想避免的例子是:

cudaMemcpyFromSymbol(&hostptr, devptr, sizeof(ptrfunction));
kernel<<<...,...>>>(hostptr);
cudaDeviceSynchronize();

此示例效果很好。在设备中声明的函数指针devptr,指向函数multiply,被复制到主机中的函数指针。然后,它可以作为参数传递给内核。 正如我之前解释的那样,这个缺点是我必须在主指针指向的函数之前进行硬编码,这是我想要避免的。 使用前面的例子,我试图直接将设备函数复制到主机中的函数指针,而不是复制设备函数指针。在这里,我尝试将设备函数复制到主机函数指针:

cudaMemcpyFromSymbol(&hostptr, multiply, sizeof(ptrfunction));
kernel<<<...,...>>>(hostptr);
cudaDeviceSynchronize();

它没有抱怨就编译。但是当我使用cuda-mem启动它时,我得到的是:

程序命中cudaErrorInvalidSymbol(错误13),因为&#34;无效的设备符号&#34;在CUDA API上调用cudaMemcpyFromSymbol。 ... 硬件堆栈溢出 =========在0x00022ca8 设备框架:内核......

将设备函数指针复制到主机函数指针有效,但是当我尝试直接复制函数时,它不起作用。皮蒂。

问题是,如何从主机访问设备函数的地址(添加,乘法,...)以将其作为内核的参数传递或使用API​​将其复制到设备功能指针?

0 个答案:

没有答案