CUDA CUBIN/PTX文件动态加载

程序演示了如何动态加载CUBIN/PTX文件并执行其中的函数,包含cubin.cu、main.cu两个文件。其中cubin.cu包含需要被动态加载的函数kernel_run。

cubin.cu

#include 
#include 

extern "C"   __global__  void kernel_run(){
    printf("hello world!\n");
}

main.cu

#include 
#include 
#include 
int main(){

    CUresult error;
    CUdevice cuDevice; 
    cuInit(0);
    int deviceCount = 0;
        error = cuDeviceGetCount(&deviceCount);
    printf("device count is %d\n",deviceCount);
    error = cuDeviceGet(&cuDevice, 0); 

    if(error!=CUDA_SUCCESS){
        printf("Error happened in get device!\n");
    }

    CUcontext cuContext;
    error = cuCtxCreate(&cuContext, 0, cuDevice);
    if(error!=CUDA_SUCCESS){
        printf("Error happened in create context!\n");
    }
    CUmodule module;

    error=cuModuleLoad (&module, "first.cubin");
    if(error!=CUDA_SUCCESS){
        printf("Error happened in load moudle %d!\n",error);
    }
    CUfunction mykernel;
    error= cuModuleGetFunction(&mykernel,module,"kernel_run");
    //error= cuModuleGetFunction(&mykernel,module,"_Z10kernel_runv");
    if(error!=CUDA_SUCCESS){
        printf("get function error!\n");
    }
    cuLaunchKernel(mykernel, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0);
    cudaThreadSynchronize();
    printf("Over\n");
    return 1;
}

注意:cuModuleGetFunction中的函数名为编译后的函数名,extern “C” 声明kernel函数可以使得编译后的函数名保持不变,否则按C++的函数名_Z10kernel_runv 否则找不到

makefile

NVCC=/usr/local/cuda-7.0/bin/nvcc
LIBS= -lcuda
all:main

first.cubin:cubin.cu
    $(NVCC) -ptx -o $@ $< -lcuda -arch=sm_30

main:main.cu
    $(NVCC) -rdc=true $(LIBS) -o main main.cu
clean:
    rm -rf main

注意:cubin文件需要根据硬件的实际情况知名 -arch否则文件无法成功加载会报错误。PTX文件作为中间文件则一般不需要关注这个问题。

你可能感兴趣的:(cuda并行计算)