CULA 安装包里包含了几个例子,用来显示如何使用CULA.这些例子放在‘examples’ 目录里.
这里列出几个常用的,使用CULA函数的例子.
Initialization and Shutdown
#include <cula.h>
culaStatus s;
s = culaInitialize();
if(s != culaNoError)
{
printf("%s\n", culaGetErrorString(s));
/* ... Error Handling ... */
}
/* ... Your code ... */
culaShutdown();
Argument Errors
#include <cula.h>
culaStatus s;
s = culaSgeqrf(-1, -1, NULL, -1, NULL); /* obviously wrong */
if(s != culaNoError)
{
if(s == culaArgumentError)
printf("Argument %d has an illegal value\n", culaGetErrorInfo());
else
printf("%s\n", culaGetErrorString(s));
}
Data Errors
#include <cula.h>
float* A = malloc(20*20*sizeof(float));
memset(A, 0, 20*20*sizeof(float)); /* singular matrix, illegal for LU (getrf) */
int ipiv[20];
s = culaSgetrf(20, 20, A, 20, ipiv);
if( s != culaNoError )
{
if( s == culaDataError )
printf("Data error with code %d, please see LAPACK documentation\n",
culaGetErrorInfo());
else
printf("%s\n", culaGetErrorString(s));
}
Printing Errors to the Console
#include <cula.h>
culaStatus s;
int info;
char buf[256];
s = <cula function>;
if( s != culaNoError )
{
info = culaGetErrorInfo();
culaGetErrorInfoString(s, info, buf, sizeof(buf));
printf("%s", buf);
}
使用 C++ 接口
#include <cula.hpp>
template<class T>
void GenericLU(T* A, int N) // type of T will be determined by the compiler
{
std::vector<int> piv(N);
// no need for type specifier - determined automatically on overloads
culaStatus s = culaGetrf(N, N, A, N, &ipiv[0]);
// check errors
}
检查有没有正确连接到库
#include <cula.h>
int MeetsMinimumCulaRequirements()
{
int cudaMinimumVersion = culaGetCudaMinimumVersion();
int cudaRuntimeVersion = culaGetCudaRuntimeVersion();
int cudaDriverVersion = culaGetCudaDriverVersion();
int cublasMinimumVersion = culaGetCublasMinimumVersion();
int cublasRuntimeVersion = culaGetCublasRuntimeVersion();
if(cudaRuntimeVersion < cudaMinimumVersion)
{
printf("CUDA runtime version is insufficient; "
"version %d or greater is required\n", cudaMinimumVersion);
return 0;
}
if(cudaDriverVersion < cudaMinimumVersion)
{
printf("CUDA driver version is insufficient; "
"version %d or greater is required\n", cudaMinimumVersion);
return 0;
}
if(cublasRuntimeVersion < cublasMinimumVersion)
{
printf("CUBLAS runtime version is insufficient; "
"version %d or greater is required\n", cublasMinimumVersion);
return 0;
}
return 1;
}