【发布时间】: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
这不是我所期望的:许多元素都是非零的。这里有几个观察
- 我检查了
cuda-memcheck- 没有错误。与valgrind的memcheck核对 - 没有错误。 - 内存分配按预期工作,
nvidia-smi报告4179MiB / 6143MiB - 如果我
- 分配更少的内存(例如 2 GB)
- 使用
-arch sm_30或-arch compute_30编译(参见capabilities) - 从 SDK 版本 6.0 回到 5.5
- 从GTX Titan 到Tesla K20c(此处启用ECC 检查,所有计数器为零);行为是相同的,我能够在五种不同的 GPU 卡上对其进行测试。
- 在设备上分配多个较小的数组
- 如果我在 GTX 680 上测试,错误就会消失
再次,问题是:为什么我会看到这些内存错误,我如何确保这永远不会发生?
【问题讨论】:
-
你能在另一块板上试试你的代码,看看是不是硬件问题吗?
-
讨厌 - 听起来像是硬件问题,但可能值得在 nVidia 开发者论坛上发布您的问题。
-
您是否在检查您的
p指针是否为NULL? -
您的代码在运行 64 位 linux 的 sm_30 系统和 CUDA 5.5 和 6.0 发行版上非常适合我。你能成功运行任何工具包演示程序吗?
-
这两种可能性要么是 CUDA 安装损坏,要么是硬件/系统配置问题。我不能告诉你哪个,我不认为这真的在一个有效的Stack Overflow问题的范围内,对不起。