-3

我正在尝试使用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

我已经明确指出nvcc并使用g++-4.9并重现了两个版本的问题。g++-4.8-ccbin g++-4.xg++

这里有什么明显的错误吗?如何解决问题?

如果重要的话,我使用的是 Ubuntu 17.04 和 NVIDIA 驱动程序版本 375.82。

更新:我安装g++-5了,核心转储消失了。

4

1 回答 1

-2

几乎 99% 的时间,这个错误意味着你破坏了某些东西或者你正在访问损坏的内存区域(或者甚至太多的递归超过了堆栈限制)。

使用Valgrind 之类的免费工具或您最喜欢的 IDE 调试器来了解发生这种情况的位置和原因。

于 2017-10-11T22:51:04.243 回答