【问题标题】:CUDA memory errorCUDA内存错误
【发布时间】:2014-08-01 09:45:54
【问题描述】:

我在多个 GPU(每台机器两个 GPU)上运行高性能计算,目前我在 GeForce GTX TITAN 上测试我的代码。最近我注意到随机内存错误发生了,所以我不能再依赖结果了。试图调试并遇到我不明白的事情。如果有人能帮助我理解为什么会发生以下情况,我将不胜感激。

所以,这是我的 GPU:

$ nvidia-smi -a
Driver Version                      : 331.67
GPU 0000:03:00.0
    Product Name                    : GeForce GTX TITAN
    ...
    VBIOS Version                   : 80.10.2C.00.02
    FB Memory Usage
        Total                       : 6143 MiB
        Used                        : 14 MiB
        Free                        : 6129 MiB
    Ecc Mode
        Current                     : N/A
        Pending                     : N/A

我的 Linux 机器(Ubuntu 12.04 64 位):

$ uname -a
Linux cluster-cn-211 3.2.0-61-generic #93-Ubuntu SMP Fri May 2 21:31:50 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

这是我的代码(基本上,分配 4G 内存,填充零,复制回主机并检查所有值是否为零;剧透:它们不是)

#include <cstdio>

#define check(e) {if (e != cudaSuccess) { \
        printf("%d: %s\n", e, cudaGetErrorString(e)); \
        return 1; }}

int main() {
    size_t num  = 1024*1024*1024;      // 1 billion elements
    size_t size = num * sizeof(float); // 4 GB of memory
    float *dp;
    float *p = new float[num];
    cudaError_t e;

    e = cudaMalloc((void**)&dp, size); // allocate
    check(e);

    e = cudaMemset(dp, 0, size);       // set to zero
    check(e);

    e = cudaMemcpy(p, dp, size, cudaMemcpyDeviceToHost); // copy back
    check(e);

    for(size_t i=0; i<num; i++) {
        if (p[i] != 0)                   // this should never happen, amiright?
            printf("%lu %f\n", i, p[i]);
    }
    return 0;
}

我是这样运行的

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Sat_Jan_25_17:33:19_PST_2014
Cuda compilation tools, release 6.0, V6.0.1

$ nvcc test.cu 
nvcc warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release.

$ ./a.out | head
516836128 -0.000214
516836164 -0.841684
516836328 -3272.289062
516836428 -644673853950867887966360388719607808.000000
516836692 0.000005
516850472 232680927002624.000000
516850508 909806289566040064.000000
...

$ echo $?
0

这不是我所期望的:许多元素都是非零的。这里有几个观察

  1. 我检查了cuda-memcheck - 没有错误。与valgrindmemcheck 核对 - 没有错误。
  2. 内存分配按预期工作,nvidia-smi 报告4179MiB / 6143MiB
  3. 如果我
    • 分配更少的内存(例如 2 GB)
    • 使用-arch sm_30-arch compute_30 编译(参见capabilities
    • 从 SDK 版本 6.0 回到 5.5
    • GTX TitanTesla K20c(此处启用ECC 检查,所有计数器为零);行为是相同的,我能够在五种不同的 GPU 卡上对其进行测试。
    • 在设备上分配多个较小的数组
  4. 如果我在 GTX 680 上测试,错误就会消失

再次,问题是:为什么我会看到这些内存错误,我如何确保这永远不会发生?

【问题讨论】:

  • 你能在另一块板上试试你的代码,看看是不是硬件问题吗?
  • 讨厌 - 听起来像是硬件问题,但可能值得在 nVidia 开发者论坛上发布您的问题。
  • 您是否在检查您的p 指针是否为NULL
  • 您的代码在运行 64 位 linux 的 sm_30 系统和 CUDA 5.5 和 6.0 发行版上非常适合我。你能成功运行任何工具包演示程序吗?
  • 这两种可能性要么是 CUDA 安装损坏,要么是硬件/系统配置问题。我不能告诉你哪个,我不认为这真的在一个有效的Stack Overflow问题的范围内,对不起。

标签: c++ linux memory cuda


【解决方案1】:

我也使用 CPU 执行计算,我们发现了同样的问题。我们使用的是 GeForce GTX 660 Ti 型号。

我检查了错误数量是否随着 GPU 工作时间的增加而增加。 问题可以通过关闭计算机来解决(如果机器重新启动它不起作用),但工作一段时间后问题再次出现。 我不知道为什么会这样。我已经尝试了几种代码来检查内存,它们都给出了相同的结果。

据我检查,这个问题是无法避免的,唯一能确保你的结果正常的方法是在计算后检查内存并经常关闭机器。我知道这不是一个好的解决方案,但这是我找到的唯一解决方案。

【讨论】:

  • 您肯定遇到了硬件问题。这听起来很像硬件退化。一个非常强烈的提示是,让硬件冷却可以减少问题。世界上没有软件可以解决这个问题。您刚刚发现,为什么要将 ECC 内存用于关键任务应用程序(以检测此类问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多