런타임시 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)