CUDA の cusolver ライブラリを使用して、GPU で QR 分解を実行しようとしています。
問題を以下の例に減らしました。
基本的に、いくつかの手順は次のとおりです。
- ホスト上でメモリを割り当て、[5x3] マトリックスを 1 で初期化しました。
- メモリを割り当てて、マトリックスをデバイスにコピーします
- ソルバーハンドラーを初期化します
cusolverDnCreate
- 必要なワークスペースのサイズを決定します
cusolverDnDgeqrf_bufferSize
- 最後に、QR 因数分解を実行してみます
cusolverDnDgeqrf
残念ながら、最後のコマンドは (int 値 = 6) を返すことで体系的に失敗し、CUSOLVER_STATUS_EXECUTION_FAILED
何が問題なのかわかりません!
欠陥のあるコードは次のとおりです。
#include <cusolverDn.h>
#include <cuda_runtime_api.h>
int main(void)
{
int N = 5, P = 3;
double *hostData;
cudaMallocHost((void **) &hostData, N * sizeof(double));
for (int i = 0; i < N * P; ++i)
hostData[i] = 1.;
double *devData;
cudaMalloc((void**)&devData, N * sizeof(double));
cudaMemcpy((void*)devData, (void*)hostData, N * sizeof(double), cudaMemcpyHostToDevice);
cusolverStatus_t retVal;
cusolverDnHandle_t solverHandle;
retVal = cusolverDnCreate(&solverHandle);
std::cout << "Handler creation : " << retVal << std::endl;
double *devTau, *work;
int szWork;
cudaMalloc((void**)&devTau, P * sizeof(double));
retVal = cusolverDnDgeqrf_bufferSize(solverHandle, N, P, devData, N, &szWork);
std::cout << "Work space sizing : " << retVal << std::endl;
cudaMalloc((void**)&work, szWork * sizeof(double));
int *devInfo;
cudaMalloc((void **)&devInfo, 1);
retVal = cusolverDnDgeqrf(solverHandle, N, P, devData, N, devTau, work, szWork, devInfo); //CUSOLVER_STATUS_EXECUTION_FAILED
std::cout << "QR factorization : " << retVal << std::endl;
int hDevInfo = 0;
cudaMemcpy((void*)devInfo, (void*)&hDevInfo, 1 * sizeof(int), cudaMemcpyDeviceToHost);
std::cout << "Info device : " << hDevInfo << std::endl;
cudaFree(devInfo);
cudaFree(work);
cudaFree(devTau);
cudaFree(devData);
cudaFreeHost(hostData);
cudaDeviceReset();
}
私のコードに明らかなエラーがありましたら、お知らせください。どうもありがとう。