我有以下功能
void dummy() {
cusolverDnHandle_t cudenseH;
cusolverStatus_t cusolver_status = cusolverDnCreate(&cudenseH);
checkStatus(cusolver_status);
cusolverDnDestroy(cudenseH);
cudaDeviceReset();
}
如果我两次调用此函数,checkStatus
将在第二次调用时失败,同时测试cusolverDnCreate(&cudenseH);
的结果。
答案 0 :(得分:1)
问题与在cudaDeviceReset()
函数末尾使用dummy()
有关,该函数会重置驱动程序的状态。在第二次调用dummy()
之前,您需要重新初始化设备。初始化设备的典型方法是使用cudaFree(0)
。
这是您的代码的工作版本:
#include "cuda_runtime.h"
#include "device_launch_paraMeters.h"
#include<stdio.h>
#include <cusolverDn.h>
#include <cuda_runtime_api.h>
#include "Utilities.cuh"
void dummy() {
cusolverDnHandle_t cudenseH;
cusolverStatus_t cusolver_status = cusolverDnCreate(&cudenseH);
cusolveSafeCall(cusolver_status);
cusolverDnDestroy(cudenseH);
cudaDeviceReset();
}
/********/
/* MAIN */
/********/
int main(){
printf("First call\n");
dummy();
cudaFree(0);
printf("Second call\n");
dummy();
return 0;
}
Utilities.cu
和Utilities.cuh
个文件被隐藏here并被省略。