使用 googlebenchmark 核心转储对 CUDA 进行基准测试
Posted
技术标签:
【中文标题】使用 googlebenchmark 核心转储对 CUDA 进行基准测试【英文标题】:Benchmarking CUDA with googlebenchmark core dumps 【发布时间】:2017-10-11 22:44:55 【问题描述】:我正在尝试使用 google benchmark 对一些 CUDA 代码进行基准测试。首先,我没有编写任何 CUDA 代码,只是想确保我可以对使用 nvcc
编译的主机函数进行基准测试。在main.cu
我有
#include <benchmark/benchmark.h>
size_t fibr(size_t n)
if (n == 0)
return 0;
if (n == 1)
return 1;
return fibr(n-1)+fibr(n-2);
static void BM_FibRecursive(benchmark::State& state)
size_t y;
while (state.KeepRunning())
benchmark::DoNotOptimize(y = fibr(state.range(0)));
BENCHMARK(BM_FibRecursive)->RangeMultiplier(2)->Range(1, 1<<5);
BENCHMARK_MAIN();
我编译:
nvcc -g -G -Xcompiler -Wall -Wno-deprecated-gpu-targets --std=c++11 main.cu -o main.x -lbenchmark
当我运行程序时,我收到以下错误:
./main.x
main.x: malloc.c:2405: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
[1] 11358 abort (core dumped) ./main.x
我已经使用-ccbin g++-4.x
明确指出nvcc
到g++-4.9
和g++-4.8
,并且已经重现了g++
的两个版本的问题。
这里有什么明显的错误吗?如何解决问题?
如果重要的话,我使用的是 Ubuntu 17.04 和 NVIDIA 驱动程序版本 375.82。
更新:我安装了g++-5
,核心转储消失了。
【问题讨论】:
如果直接用g++而不是nvcc编译代码,会不会出现core dump? 不,它没有。我将关闭,因为它不使用 g++-5 进行核心转储。 我愿意结束这个问题,但人们知道 Ubuntu 17 上的 nvcc+gcc-4 段错误并不是完全没用的。。 .让我知道你的意见。 【参考方案1】:几乎 99% 的情况下,此错误意味着您破坏了某些东西或您正在访问损坏的内存区域(或者甚至是过多的递归超出了堆栈限制)。
使用Valgrind 之类的免费工具或您最喜欢的 IDE 调试器来了解发生这种情况的位置和原因。
【讨论】:
以上是关于使用 googlebenchmark 核心转储对 CUDA 进行基准测试的主要内容,如果未能解决你的问题,请参考以下文章