[BUG] benchmark::DoNotOptimize does not prevent a reference from being optimized away.
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- cpp
- 領域
- performance
調査の方向性
benchmark::DoNotOptimize から始め、提供された再現コードを GCC と Clang でコンパイルし、ループ内の参照がある場合とない場合で生成されるアセンブリを比較します。リンクされている Compiler Explorer の例を使って動作を検証します。意味論が確認されて文書化されるか、具体的な変更が定義された時点で issue は完了です。
索引モデルが issue の本文から書いたものです。
説明
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.
- 主要言語
- C++
- スター
- 10.5k
- フォーク
- 1.8k
- 平均マージ
- 1日 15時間
- マージ済み PR(30日)
- 28
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
google/benchmark のほかの issue
-
[BUG] Confusing title in docs/platform_specific_build_instructions.md対応中かも @skryabae が 30 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
メンテナーはふだん 1 日以内に返信
-
[BUG] Memory manager counts allocations not part of benchmark再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
google/benchmark#2149 · コメント 5 件 ·
メンテナーはふだん 1 日以内に返信
-
[FR] Add native Zig bindings via top-level `bindings/zig`再び着手できるかも このイシューのプルリクエストはマージされずにクローズされました。 オープン
難易度 5/5 1週間以上 初心者へのやさしさ 42/100
google/benchmark#2266 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
google/benchmark#2235 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 20/100
google/benchmark#2195 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
google/benchmark の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
arvidn/libtorrent#9149 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
Niko1221/Strata#5560 · コメント 2 件 ·
メンテナーはふだん 4 日以内に返信
-
NVIDIA windows
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信
-
要トリアージ 辞書
難易度 1/5 1〜3時間 初心者へのやさしさ 86/100
yksr-melt/Meltype#1625 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信