Warum ist Rep Movsb langsam für überlappende Vorwärtsmemmove und warum nutzt LIBC es?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum ist Rep Movsb langsam für überlappende Vorwärtsmemmove und warum nutzt LIBC es?

Post by Anonymous »

tl; dr: memmove , das rep movsb verwendet wird, ist im Vergleich zu Memmove für 8191 Elemente, bei denen Rep Movsb

Code: Select all

#include 
#include 

using namespace std;

alignas(4096) unsigned char v[1024 * 1024];

void bm_memmove(benchmark::State& state) {
const auto size = static_cast(state.range(0));
const auto n    = static_cast(state.range(1));

const size_t n1 = n < 0 ? 0 : n;
const size_t n0 = n < 0 ? -n : 0;

benchmark::DoNotOptimize(v);

for (auto _ : state) {
memmove(v + n0, v + n1, size);
benchmark::DoNotOptimize(v);
}
}

BENCHMARK(bm_memmove)->ArgsProduct({{8191, 8193}, {-5, +5}});

BENCHMARK_MAIN();
< /code>
Die Ausgabe für mich am 12. Gen Intel (R) Core (TM) i5-1235u und die neueste MSVC lautet wie folgt: < /p>
2025-05-13T12:13:36+03:00
Running out\bench\benchmark-memmove.exe
Run on (12 X 2496 MHz CPU s)
CPU Caches:
L1 Data 48 KiB (x6)
L1 Instruction 32 KiB (x6)
L2 Unified 1280 KiB (x6)
L3 Unified 12288 KiB (x1)
-------------------------------------------------------------
Benchmark                   Time             CPU   Iterations
-------------------------------------------------------------
bm_memmove/8191/-5       71.4 ns         71.5 ns      8960000
bm_memmove/8193/-5       71.1 ns         71.5 ns      8960000
bm_memmove/8191/5        62.6 ns         61.0 ns      8960000
bm_memmove/8193/5        1903 ns         1925 ns       373333
Dies steht im Einklang mit den schnellen C ++ -Nchmark-Ergebnissen auf Clang 17:
https://quick-fench.com/q/mqxznxpvzbrf6ab5aaOsholnho 4

gcc 13.2 ist fein: />https://quick-tench.com/q/zh-s5bpzcjltzzdm982Byoa4o9w
manchmal über AVX2-Anweisungen implementiert ist, der problematische Fall ist nur repsb . Ich denke, es ist das gleiche für Clang.0x140125e40 push rdi
0x140125e41 push rsi
0x140125e42 mov rdi, rcx
0x140125e45 mov rsi, rdx
0x140125e48 mov rcx, r8
0x140125e4b rep movsb byte ptr [rdi], byte ptr [rsi]
0x140125e4d pop rsi
0x140125e4e pop rdi
0x140125e4f ret
< /code>
Der gleiche Benchmark zeigt dieses Problem in meiner älteren Hardware (Intel (R) Core (TM) i7-8750H) nicht an: < /p>
2025-05-13T15:22:03+03:00
Running benchmark-memmove.exe
Run on (12 X 2208 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x6)
L1 Instruction 32 KiB (x6)
L2 Unified 256 KiB (x6)
L3 Unified 9216 KiB (x1)
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
bm_memmove/8191/-5 143 ns 141 ns 4977778
bm_memmove/8193/-5 145 ns 146 ns 4480000
bm_memmove/8191/5 77.2 ns 76.7 ns 8960000
bm_memmove/8193/5 80.9 ns 80.2 ns 8960000
< /code>
Auch die Ergebnisse auf i5-1235u sehen nicht schlecht aus, wenn Sie die Affinität zu E-Core festlegen: < /p>
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
bm_memmove/8191/-5 131 ns 131 ns 5600000
bm_memmove/8193/-5 136 ns 135 ns 4977778
bm_memmove/8191/5 124 ns 123 ns 5600000
bm_memmove/8193/5 179 ns 180 ns 4072727
< /code>
Das Problem wird auch auf i5-11400h (Tigersee) und Xeon Platinum 8362 (ICE Lake) beobachtet. Bibliotheken werden behoben?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post