J'essaie d'étalonner du code CUDA en utilisant google benchmark. Pour commencer, je n'ai pas écrit de code CUDA, et je veux juste m'assurer que je peux comparer une fonction hôte compilée avec nvcc
. En main.cu
jeBenchmarking CUDA avec des décharges de base de googlebenchmark
#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();
Je compilez avec:
nvcc -g -G -Xcompiler -Wall -Wno-deprecated-gpu-targets --std=c++11 main.cu -o main.x -lbenchmark
Quand je lance le programme, je reçois l'erreur suivante:
./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
J'ai explicitement souligné nvcc
à g++-4.9
et g++-4.8
en utilisant -ccbin g++-4.x
et ont reproduit le problème avec les deux versions de g++
.
Y at-il quelque chose qui cloche ici? Comment le problème peut-il être résolu?
Je suis sur Ubuntu 17.04 et la version du pilote NVIDIA 375.82, si c'est important.
Mise à jour: J'ai installé g++-5
et la mémoire principale s'est envolée.
Si vous compilez le code directement avec g ++ plutôt que nvcc, est-ce que le vidage du noyau se produit? – talonmies
Non, ce n'est pas le cas. Je vais fermer car il ne fait pas core dump en utilisant g ++ - 5. – user14717
Je suis prêt à fermer cette question, mais il n'est pas totalement inutile pour les gens de savoir que nvcc + gcc-4 segfaults sur Ubuntu 17.. . Lemme connaître votre opinion. – user14717