使用 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 明确指出nvccg++-4.9g++-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 进行基准测试的主要内容,如果未能解决你的问题,请参考以下文章

浮点异常(核心转储)cpp

分段错误:核心转储 C++ 向量对字符串:

gdb 搜索核心转储内存

杀死进程而不创建核心转储?

启用核心转储是不是需要 gcc 的 -g?

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误