[BUG] benchmark::DoNotOptimize does not prevent a reference from being optimized away.
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- cpp
- Área
- performance
Línea de trabajo
Comienza con benchmark::DoNotOptimize y compila el reproductor proporcionado en GCC y Clang, comparando el ensamblado generado con y sin la referencia en el bucle. Usa los ejemplos enlazados de Compiler Explorer para verificar el comportamiento; el issue estará terminado cuando se confirmen y documenten las semánticas o se defina un cambio concreto.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
benchmark::DoNotOptimize() does not prevent a reference from being optimized away.
System
OS: Ubuntu 20.04 LTS, Compiler explorer
Compiler: GCC 9.04, GCC trunk, Clang trunk
To reproduce
Compiler Explorer that works: https://godbolt.org/z/c3d5sc8s3
Compiler Explorer that does not: https://godbolt.org/z/3bMMvaecr
Alternatively, compile the following code
#include <vector>
#include <benchmark/benchmark.h>
static void bm_traverse(benchmark::State& state) {
const size_t N = 500;
std::vector<int> vec;
for (size_t j = 0; j < N; ++j) vec.push_back(j);
for (auto _ : state) {
for (auto& value : vec) {
asm("nop"); // just to locate asm point faster
benchmark::DoNotOptimize(value);
}
benchmark::DoNotOptimize(vec);
}
state.SetComplexityN(N);
}
BENCHMARK(bm_traverse);
BENCHMARK_MAIN();
Expected behavior
DoNotOptimize should have preserved the loop read. I understand that the reference is basically a pointer but users typically would expect that the reference represents the actual lvalue.
Screenshots
With the "&" reference in the inner loop, a vec load is not generated.
.LBB0_31: # Parent Loop BB0_6 Depth=1
nop
addq $4, %rax
cmpq %rcx, %rax
jne .LBB0_31
If you remove the reference the vec load is generated.
.LBB0_31: # Parent Loop BB0_6 Depth=1
movl (%rax), %edx # <<<< HERE
movl %edx, 12(%rsp)
nop
addq $4, %rax
cmpq %rcx, %rax
jne .LBB0_31
Additional context
I understand this is a matter of semantics that might have been discussed in the past. In this case, I'd just like confirmation of this behavior.
- Lenguaje dominante
- C++
- Estrellas
- 10.5k
- Forks
- 1.8k
- Merge medio
- 1 d 15 h
- PR fusionados (30 d)
- 28
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de google/benchmark
-
[BUG] Confusing title in docs/platform_specific_build_instructions.mdPosiblemente ocupada @skryabae la tomó hace 30 días. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
[BUG] Memory manager counts allocations not part of benchmarkQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
google/benchmark#2149 · 5 comentarios ·
Los mantenedores suelen responder en 1 día
-
[FR] Add native Zig bindings via top-level `bindings/zig`Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 42/100
google/benchmark#2266 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
google/benchmark#2235 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
google/benchmark#2195 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de google/benchmark
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
arvidn/libtorrent#9149 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Niko1221/Strata#5560 · 2 comentarios ·
Los mantenedores suelen responder en 4 días
-
NVIDIA windows
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
[辞書] C/C++のプリプロセッサ指令名を英字のままにするAbierto要トリアージ 辞書
Dificultad 1/5 1-3 horas Aptitud para principiantes 86/100
yksr-melt/Meltype#1625 · 1 reacción ·
Los mantenedores suelen responder en 1 día