对包含cudaDeviceReset()调用的函数进行双重调用失败

时间:2015-03-25 08:16:46

标签: matrix cuda

我有以下功能

void dummy() {
    cusolverDnHandle_t cudenseH;
    cusolverStatus_t cusolver_status = cusolverDnCreate(&cudenseH); 
    checkStatus(cusolver_status);

    cusolverDnDestroy(cudenseH); 
    cudaDeviceReset(); 
}

如果我两次调用此函数,checkStatus将在第二次调用时失败,同时测试cusolverDnCreate(&cudenseH);的结果。

1 个答案:

答案 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.cuUtilities.cuh个文件被隐藏here并被省略。