2012-05-21 8 views
0

런타임시 dudym으로 cuda 드라이버 API 함수를로드하려고하는데 이상한 오류가 발생했습니다. 내가 쓴 PTX 코드Cuda 드라이버 호출이 오류 1을 반환합니다 (cudaErrorMissingConfiguration)

#include <cuda.h> 
#include <stdio.h> 

int main(int argc,char *argv[]){ 

    if(argc<3){ 
    printf("Usage: ./test.cu <ptx_file> <cuda_device>\n"); 
    exit(0); 
    } 

    // Error code 
    CUresult error; 

    // My number 
    unsigned int h_var=7; 

    // Initialize driver API 
    error = cuInit(0); 
    if((int)error!=0){ 
    printf("Error! cuInit returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Get Cuda Device and give handle 
    CUdevice cu_device; 
    error = cuDeviceGet(&cu_device,atoi(argv[2])); 
    if((int)error!=0){ 
    printf("Error! cuDeviceGet returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Create context to run on device 
    CUcontext cu_context; 
    error = cuCtxCreate(&cu_context, 0, cu_device); 
    if((int)error!=0){ 
    printf("Error! cuCtxCreate returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Load ptx code 
    CUmodule cu_module; 
    error = cuModuleLoad(&cu_module,argv[1]); 
    if((int)error!=0){ 
    printf("Error! cuModuleLoad returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Get kernel function 
    CUfunction func; 
    error = cuModuleGetFunction(&func,cu_module,"testing"); 
    if((int)error!=0){ 
    printf("Error! cuModuleGetFunction returned: %d\n",(int)error); 
    exit(0); 
    } 

    CUdeviceptr var; 

    // Allocate device memory 
    unsigned int size = sizeof(unsigned int); 
    error = cuMemAlloc(&var, size); 
    if((int)error!=0){ 
    printf("Error! cuMemAlloc returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Copy variable to host 
    error = cuMemcpyHtoD(var,&h_var,size); 
    if((int)error!=0){ 
    printf("Error! cuMemcpyHtoD returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Lauch kernel 
    void *args[] = {&var}; 
    error = cuLaunchKernel(func, 1, 1, 1, 1, 1, 1, 0, NULL, args, NULL); 
    if((int)error!=0){ 
    printf("Error! cuLaunchKernel returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Get result to host 
    error = cuMemcpyDtoH(&h_var,var,size); 
    if((int)error!=0){ 
    printf("Error! cuMemcpyDtoH returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Free device memory 
    error = cuMemFree(var); 
    if((int)error!=0){ 
    printf("Error! cuMemFree returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Destroy context 
    error = cuCtxDestroy(cu_context); 
    if((int)error!=0){ 
    printf("Error! cuCtxDestroy returned: %d\n",(int)error); 
    exit(0); 
    } 

    // Print result 
    printf("var: %d\n",h_var); 
} 

: 나는 (등 NVCC 컴파일) 내 시스템에 원활하게 실행이 코드가 (이 간단한 또한 그냥 작동하는지 테스트)

. 버전 1.4 .target의 sm_10, map_f64_to_f32

.entry testing (
    .param .u64 mynum) 
{ 

    .reg .u64 %r; 
    .reg .u64 %i; 
    ld.param.u64 %r,[mynum]; 
    ld.global.u64 %i,[%r]; 
    add.u64 %i,%i,3; 
    st.global.u64 [%r+0],%i; 
    exit; 

} 

지금까지 너무 좋아. 그런 다음 코드를 가져 와서 다음과 같이 dlsym을 사용하여 모든 함수를로드했습니다.

/* Lauch kernel */ 
    void *args[] = {&var}; 
    int (*_cuLaunchKernel)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, void *, void **, void **); 
    *(void **)(&_cuLaunchKernel) = dlsym(dlhandle, "cuLaunchKernel"); 
    (*_cuLaunchKernel)(cu_func,1 , 1, 1, 1, 1, 1, 0, NULL, args, NULL); 


/* Get result to host */ 
    int (*_cuMemcpyDtoH)(void *, void *, size_t); 
    *(void **)(&_cuMemcpyDtoH) = dlsym(dlhandle, "cuMemcpyHtoD"); 
    error = (*_cuMemcpyDtoH)(&h_var,var,size); 

(나머지 코드는 동일한 로직에 있음). 모든 함수는 0으로 반환됩니다. 즉, 오류 1 (= cudaErrorMissingConfiguration)을 반환하는 마지막 하나 인 _cuMemcpyDtoH를 제외한 모든 것이 정상적으로 처리되었음을 의미합니다. 누군가이 오류의 의미를 설명하고 오류의 원인을 설명 할 수 있습니까? 그것을 해결할 방법이 있습니까? 그리고 런타임에 함수를로드 할 때 나타나는 이유는 무엇입니까?

감사합니다.

내 시스템 : NVCC 릴리스 4.1 GPU : GTX 480 NVRM 버전 : NVIDIA UNIX x86_64의 커널 모듈 285.05.32 GCC 버전 : GCC 버전 4.5.2 (우분투/리나 4.5.2-8ubuntu4)

답변

0

*(void **)(&_cuMemcpyDtoH) = dlsym(dlhandle, "cuMemcpyHtoD"); 

--- 당신이하려고하는 t : 사용중인 드라이버 API, erorr 코드의 경우 1

이 오류에 대한 이유는 CUDA_ERROR_INVALID_VALUE

을 의미한다 o 잘못된 기능을 사용하십시오 : DtoH 대신 HtoD.

관련 문제