gpt4 book ai didi

c++ - 从 CUDA 库调用 cusolverDnDgeqrf 时的状态 : execution failed,

转载 作者:行者123 更新时间:2023-11-28 02:14:42 25 4
gpt4 key购买 nike

我尝试使用 CUDA 的 cusolver 库在 GPU 上执行 QR 分解。

我将我的问题简化为下面的示例。

基本上,几个步骤是:

  1. 我分配内存并用 1 初始化一个 [5x3] 矩阵主持人,
  2. 我在设备上分配内存并复制矩阵
  3. 我使用 cusolverDnCreate 初始化求解器处理程序
  4. 我使用 cusolverDnDgeqrf_bufferSize 确定所需工作空间的大小
  5. 最后,尝试使用 cusolverDnDgeqrf 进行 QR 分解

不幸的是,最后一条命令因返回 CUSOLVER_STATUS_EXECUTION_FAILED(int 值 = 6)而系统性地失败,我不知道出了什么问题!

错误代码如下:

#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();

}

如果您在我的代码中看到任何明显的错误,请告诉我!非常感谢。

最佳答案

任何时候你在使用 cuda 代码时遇到问题,你应该总是使用 proper cuda error checking并使用 cuda-memcheck 运行您的代码,寻求帮助之前。

您可能还想知道一个事实,即 relevant CUDA/cusolver sample code 中给出了一个完整的 QR 分解示例。还有示例代码 in the documentation .

通过适当的错误检查,您可能已经发现:

  1. 这是不正确的:

    cudaMalloc((void **)&devInfo, 1);

    第二个参数是以字节为单位的大小,所以它应该是 sizeof(int),而不是 1。这个错误导致 cudaMemcpyAsync 操作内部的错误cusolverDnDgeqrf 调用,它将显示在 cuda-memcheck 输出中。

  2. 这是不正确的:

    cudaMemcpy((void*)devInfo, (void*)&hDevInfo, 1 * sizeof(int), cudaMemcpyDeviceToHost);

    指针参数的顺序是首先,然后是源。因此,您将这些参数颠倒过来,并且此调用会抛出一个运行时 API 错误,如果您进行了正确的错误检查(或在 cuda-memcheck 输出中可见),您可以观察到该错误。

    <

修复这些错误后,qrf 调用实际上将返回零状态(无错误)。但我们还没有完全完成(同样,适当的错误检查会让我们知道我们还没有完全完成。)

  1. 除了上述错误外,您还犯了一些其他尺寸错误。您的矩阵大小为 N*P,因此它有 N*P 个元素,并且您在此处初始化那么多元素:

    for (int i = 0; i < N * P; ++i)
    hostData[i] = 1.;

    但您并未分配主机上的那么多元素:

    cudaMallocHost((void **) &hostData, N * sizeof(double));

    或在此处的设备上:

    cudaMalloc((void**)&devData, N * sizeof(double));

    并且您没有在此处传输那么多元素:

    cudaMemcpy((void*)devData, (void*)hostData, N * sizeof(double), cudaMemcpyHostToDevice);

    所以在上面的 3 种情况下,如果您将 N*sizeof(double) 更改为 N*P*sizeof(double) 您将能够修复这些错误,然后代码运行时 cuda-memcheck 没有报告错误,也没有从任何 API 调用返回错误。

关于c++ - 从 CUDA 库调用 cusolverDnDgeqrf 时的状态 : execution failed,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34360668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com