cublasDasum和cublasDnrm2退出程序,没有任何错误或输出

时间:2019-01-16 01:58:06

标签: cuda nvcc cublas

我正在研究使用cuda和cublas查找矩阵的p范数的函数。在该1-范数中,最常使用的是2-范数和Inf-范数。这三个简单的意思是跟随具有元素[x1,x2,x3,...,xn]的矩阵

  • 1-范数= abs(x1)+ abs(x2)+ ... + abs(xn)。可以使用cublasDasum函数来实现。
  • 2-范数= sqrt(x1 ^ 2 + x2 ^ 2 + ... + xn ^ 2)。可以使用cublasDnrm2函数来实现。
  • Inf-norm = max(abs(x1),abs(x2),...,abs(xn))。可以使用cublasIdamax函数来实现。

但是,我面临的问题是,当我使用cublasDasum和cublasDnrm2时,什么都没有发生。我没有得到任何错误或任何输出。似乎在调用这些函数时没有任何错误,程序就结束了。函数调用之后的所有操作均不执行。以下是工作示例。

#include <iostream>
#include <cmath>
#include <cuda_runtime.h>
#include <cublas_v2.h>
using namespace std;

// Error check
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
static void HandleError( cublasStatus_t err,const char *file,int line )
{
    switch (err)
    {
        case CUBLAS_STATUS_SUCCESS:
            return;
        case CUBLAS_STATUS_NOT_INITIALIZED:
            cout << "CUBLAS_STATUS_NOT_INITIALIZED";
        case CUBLAS_STATUS_ALLOC_FAILED:
            cout << "CUBLAS_STATUS_ALLOC_FAILED";
        case CUBLAS_STATUS_INVALID_VALUE:
            cout << "CUBLAS_STATUS_INVALID_VALUE";
        case CUBLAS_STATUS_ARCH_MISMATCH:
            cout << "CUBLAS_STATUS_ARCH_MISMATCH";
        // case CUBLAS_STATUS_MAPPING_err:
        //   cout << "CUBLAS_STATUS_MAPPING_err";
        case CUBLAS_STATUS_EXECUTION_FAILED:
            cout << "CUBLAS_STATUS_EXECUTION_FAILED";
        // case CUBLAS_STATUS_INTERNAL_err:
        //   cout << "CUBLAS_STATUS_INTERNAL_err";
        case CUBLAS_STATUS_NOT_SUPPORTED:
            cout << "CUBLAS_STATUS_NOT_SUPPORTED";
        // case CUBLAS_STATUS_LICENSE_err:
        //   cout << "CUBLAS_STATUS_LICENSE_err";
        default:
            cout << "Unknown error.";
    }
}

int main()
{
    // Define data and pointers
    double a[3][3] = {{1,2,3},{4,5,9},{7,8,6}}, nrm, nrm_type = 2;
    double *dev_a,*dev_nrm;

    // Allocate and copy memory
    cudaMalloc((void**) &dev_a,9*sizeof(double));
    cudaMalloc((void**) &dev_nrm, sizeof(double));
    cudaMemcpy(dev_a,a,9*sizeof(double),cudaMemcpyHostToDevice);

    // Do blas calculations
    cublasHandle_t handle;
    cublasCreate(&handle);
    if (nrm_type==1)
    {
        HANDLE_ERROR( cublasDasum(handle,9,dev_a,1,dev_nrm) );
        cudaMemcpy(&nrm,dev_nrm,sizeof(double),cudaMemcpyDeviceToHost);
    }
    else if (nrm_type==2)
    {
        HANDLE_ERROR( cublasDnrm2(handle,9,dev_a,1,dev_nrm) );
        cudaMemcpy(&nrm,dev_nrm,sizeof(double),cudaMemcpyDeviceToHost);
    }
    else if (isinf(nrm_type))
    {
        int idx;
        HANDLE_ERROR( cublasIdamax(handle,9,dev_a,1,&idx) );
        cudaMemcpy(&nrm,dev_a+idx-1,sizeof(double),cudaMemcpyDeviceToHost);
        nrm = fabs(nrm);
    }
    cublasDestroy(handle);

    // Free device memory
    cudaFree(dev_a); cudaFree(dev_nrm);

    // Print the data
    cout << nrm << endl;
}

但是,cublasIdamax调用工作正常。所以,我不知道出了什么问题。我遵循cuBLAS文档中给出的语法。我正在Windows笔记本电脑上使用cmd通过nvcc编译代码。我有NVIDIA 960M。

请帮助我解决此问题。

谢谢。

0 个答案:

没有答案