1

CUDA の cusolver ライブラリを使用して、GPU で QR 分解を実行しようとしています。

問題を以下の例に減らしました。

基本的に、いくつかの手順は次のとおりです。

  1. ホスト上でメモリを割り当て、[5x3] マトリックスを 1 で初期化しました。
  2. メモリを割り当てて、マトリックスをデバイスにコピーします
  3. ソルバーハンドラーを初期化しますcusolverDnCreate
  4. 必要なワークスペースのサイズを決定しますcusolverDnDgeqrf_bufferSize
  5. 最後に、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();

}

私のコードに明らかなエラーがありましたら、お知らせください。どうもありがとう。

4

1 に答える 1