我正在研究使用cuda和cublas查找矩阵的p范数的函数。在该1-范数中,最常使用的是2-范数和Inf-范数。这三个简单的意思是跟随具有元素[x1,x2,x3,...,xn]的矩阵
但是,我面临的问题是,当我使用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。
请帮助我解决此问题。
谢谢。