Cuda 使用dlopen从共享库加载设备功能

Cuda 使用dlopen从共享库加载设备功能,cuda,Cuda,我对cuda编程比较陌生,无法找到解决问题的方法 我试图建立一个共享库,让我们称之为func.so,它定义了一个设备函数 \uuuu设备\uuuuu无效hello(){prinf(“hello”)} 然后我希望能够通过dlopen访问该库,并在我的程序中使用该函数。我尝试了以下几点: func.cu #include <stdio.h> typedef void(*pFCN)(); __device__ void dhello(){ printf("hello\n") }

我对cuda编程比较陌生,无法找到解决问题的方法

我试图建立一个共享库,让我们称之为
func.so
,它定义了一个设备函数

\uuuu设备\uuuuu无效hello(){prinf(“hello”)}

然后我希望能够通过dlopen访问该库,并在我的程序中使用该函数。我尝试了以下几点:

func.cu

#include <stdio.h>
typedef void(*pFCN)();

__device__ void dhello(){
    printf("hello\n")
}

__device__ pFCN ptest = dhello;
pFCN h_pFCN;

extern "C" pFCN getpointer(){
    cudaMemcpyFromSymbol(&h_pFCN, ptest, sizeof(pFCN));
    return h_pFCN;
}
#include <dlfcn.h>
#include <stdio.h>

typedef void (*fcn)();
typedef fcn (*retpt)();
retpt hfcnpt;
fcn hfcn;

__device__ fcn dfcn;
__global__ void foo(){
    (*dfcn)();
}
int main() {
    void * m_handle = dlopen("gputest.so", RTLD_NOW);
    hfcnpt = (retpt) dlsym( m_handle, "getpointer");
    hfcn = (*hfcnpt)();
    cudaMemcpyToSymbol(dfcn, &hfcn, sizeof(fcn), 0, cudaMemcpyHostToDevice);
    foo<<<1,1>>>();
    cudaThreadSynchronize();
    return 0;
}
但通过这种方式,在使用cuda gdb进行调试时会出现以下错误:

CUDA Exception: Warp Illegal Instruction

Program received signal CUDA_EXCEPTION_4, Warp Illegal Instruction.
0x0000000000806b30 in dtest () at func.cu:5

我感谢你们能给我的任何帮助!:)

从另一个编译单元中的设备代码调用一个编译单元中的
\uuuuuuuuuuuuuuuuuuuu设备
函数需要使用
nvcc

但是,这种用法不适用于库

因此,如果目标
\uuuu设备
函数位于
.so
库中,且调用代码位于
.so
库之外,则使用当前的
nvcc
工具链,您的方法无法工作


我能建议的唯一“解决办法”是将所需的目标函数放在静态库中,或者将调用者和目标函数放在同一个
库中。cuda标签上有许多问题/答案,给出了这些备选方法的示例。

从另一个编译单元中的设备代码调用一个编译单元中的
\uuuuuuuuuu
函数需要使用
nvcc

但是,这种用法不适用于库

因此,如果目标
\uuuu设备
函数位于
.so
库中,且调用代码位于
.so
库之外,则使用当前的
nvcc
工具链,您的方法无法工作

我能建议的唯一“解决办法”是将所需的目标函数放在静态库中,或者将调用者和目标函数放在同一个
库中。cuda标签上有许多问题/答案,给出了这些备选方法的示例