首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态并行cudaDeviceSynchronize()崩溃

动态并行cudaDeviceSynchronize()崩溃
EN

Stack Overflow用户
提问于 2013-11-06 11:24:30
回答 1查看 2.5K关注 0票数 0

我有一个内核,它调用另一个内核。但是,当调用内核调用cudaDeviceSynchronize()时,内核崩溃并直接执行到主机。内存检查器不报告任何内存访问问题。有人知道这种不文明行为的原因是什么吗?

似乎只有在我从调试器 (Visual -> Nsight -> Start CUDA调试)运行代码时才会发生崩溃。并非每次我运行代码时都会发生崩溃--有时会崩溃,有时会结束。

以下是再现问题的完整代码:

代码语言:javascript
复制
#include <cuda_runtime.h>
#include <curand_kernel.h>
#include "device_launch_parameters.h"
#include <stdio.h>

#define CUDA_RUN(x_, err_) {cudaStatus = x_; if (cudaStatus != cudaSuccess) {fprintf(stderr, err_ "  %d - %s\n", cudaStatus, cudaGetErrorString(cudaStatus)); int k; scanf("%d", &k); goto Error;}}

struct computationalStorage {
    float rotMat;
};

__global__ void drawThetaFromDistribution() {}

__global__ void chainKernel() {
    computationalStorage* c = (computationalStorage*)malloc(sizeof(computationalStorage));
    if (!c) printf("malloc error\n");
    c->rotMat = 1.0f;

    int n = 1;
    while (n < 1000) {
        cudaError_t err;

        drawThetaFromDistribution<<<1, 1>>>();
        if ((err = cudaGetLastError()) != cudaSuccess)
            printf("drawThetaFromDistribution Sync kernel error: %s\n", cudaGetErrorString(err));
        printf("0");
        if ((err = cudaDeviceSynchronize()) != cudaSuccess)
          printf("drawThetaFromDistribution Async kernel error: %s\n", cudaGetErrorString(err));
        printf("1\n");
        ++n;
    }

    free(c);
}

int main() {
    cudaError_t cudaStatus;
    // Choose which GPU to run on, change this on a multi-GPU system.
    CUDA_RUN(cudaSetDevice(0), "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");

    // Set to use on chip memory 16KB for shared, 48KB for L1
    CUDA_RUN(cudaDeviceSetCacheConfig ( cudaFuncCachePreferL1 ), "Can't set CUDA to use on chip memory for L1");
    // Set a large heap
    CUDA_RUN(cudaDeviceSetLimit(cudaLimitMallocHeapSize, 1024 * 10 * 192), "Can't set the Heap size");

    chainKernel<<<10, 192>>>();
    cudaStatus = cudaDeviceSynchronize();
    if (cudaStatus != cudaSuccess) {
        printf("Something was wrong! Error code: %d", cudaStatus);
    }

    CUDA_RUN(cudaDeviceReset(), "cudaDeviceReset failed!");

Error:
    int k;
    scanf("%d",&k);
    return 0;
}

如果一切顺利,我希望看到:

代码语言:javascript
复制
00000000000000000000000....0000000000000001
1
1
1
1
....

当一切正常的时候,这就是我得到的。然而,当它崩溃时:

代码语言:javascript
复制
000000000000....0000000000000Something was wrong! Error code: 30

如您所见,语句err = cudaDeviceSynchronize();没有完成,执行直接到主机,在那里,它的cudaDeviceSynchronize();在未知的错误代码(30 = cudaErrorUnknown)中失败。

系统: CUDA 5.5,NVidia-Titan(无头),Windows7x64,Win32应用程序.更新:驱动显示器的附加Nvidia卡,Nsight 3.2.0.13289。

EN

回答 1

Stack Overflow用户

发布于 2013-11-06 18:32:23

最后一个事实可能是关键的事实。您没有提到所使用的nsight VSE的哪个版本,也没有确切的机器配置(例如,机器中是否有其他GPU,如果是的话,这将驱动显示器?),但是至少直到最近不可能在单GPU模式下用nsight VSE调试动态并行性应用程序。

电流特征矩阵还建议还不支持单GPU调试。

在您的情况下,一个可能的解决方法可能是添加另一个GPU来驱动显示器,并使泰坦卡无头(即不要附加任何显示器,也不要将windows桌面扩展到该GPU上)。

我运行您的应用程序与和没有库达-备忘录检查,这在我看来,没有任何问题,与它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19810818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档