[BUG] benchmark::DoNotOptimize does not prevent a reference from being optimized away.
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- performance
Direzione di ricerca
Inizia con benchmark::DoNotOptimize e compila il riproduttore fornito in GCC e Clang, confrontando l’assembly generato con e senza il riferimento nel ciclo. Usa gli esempi collegati di Compiler Explorer per verificare il comportamento; l’issue è conclusa quando la semantica è confermata e documentata oppure viene definita una modifica concreta.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- C++
- Stelle
- 10.5k
- Fork
- 1.8k
- Merge medio
- 1g 15h
- PR unite (30g)
- 28
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di google/benchmark
-
[BUG] Confusing title in docs/platform_specific_build_instructions.mdForse già presa @skryabae l’ha presa 30 giorni fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
[BUG] Memory manager counts allocations not part of benchmarkForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
google/benchmark#2149 · 5 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[FR] Add native Zig bindings via top-level `bindings/zig`Forse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 42/100
google/benchmark#2266 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
google/benchmark#2235 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
google/benchmark#2195 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di google/benchmark
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
arvidn/libtorrent#9149 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Niko1221/Strata#5560 · 2 commenti ·
I maintainer di solito rispondono entro 4 giorni
-
NVIDIA windows
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
要トリアージ 辞書
Difficoltà 1/5 1-3 ore Idoneità per principianti 86/100
yksr-melt/Meltype#1625 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno