История изменений
Исправление steemandlinux, (текущая версия) :
каким волшебным образом вы сможете сделать префетч СРАЗУ 8 пакетов, если у арма префетч команда один адрес выгребает?
Надо читать документацию и тестировать, а не теоретизировать теорию.
и что, что есть? какой с него профит-то? отрицательный? отож, отож…
и да, оффлоады далеко не на всех платформах присутствуют. и даже без использования оффлоадов какой-то двухголовый мипс спокойно пережевывает гигабит, да… на обычном айпитейблс, без волшебного дпдк.
Ну пакеты по 1500 байт любой проц потянет, там шина в основном загружена.
и да, оффлоады далеко не на всех платформах присутствуют. и даже без использования оффлоадов какой-то двухголовый мипс спокойно пережевывает гигабит, да… на обычном айпитейблс, без волшебного дпдк.
но если хочется странного - ну можете пытаться запиливать реализацию неон в дпдк, проверять и убеждаться что прирост отрицательный, а потом геморроиться с тем чтобы дпдк нормально заработал с дхцп/пппое и т.п. на роутере))) и в результате работать оно будет ровно так же как и какой-то туполинк со стоком)))
У нас беседа не про DPDK в роутере, а про оптимизацию на Rockchip.
А так как вы теоретик и на практике не можете написать симуляцию, то я сделаю за вас.
:~ $ gcc -O3 -march=armv8-a -mtune=cortex-a76 -DNDEBUG -fno-tree-vectorize -fno-tree-slp-vectorize scalar_auto.c -o sim
:~ $ gcc -O3 -march=armv8-a -mtune=cortex-a76 -DNDEBUG scalar_auto.c -o sim_neon
:~ $ ./sim
Total elements: 500000000 (chunk=8000000)
scalar: 1.144 s, 437.01 M elems/s, digest=16447876457047
:~ $ ./sim_neon
Total elements: 500000000 (chunk=8000000)
scalar: 0.557 s, 897.07 M elems/s, digest=16447876457047
:~ $ objdump -d ./sim | egrep -n '\b(ld1|st1|ld2|st2|zip1|zip2|uzp1|uzp2|ext|tbl|tbx|add\s+v|sub\s+v|mul\s+v|eor\s+v|orr\s+v|and\s+v|f(add|mul|mla|madd))'
248: b30: 1f492048 fmadd d8, d2, d9, d8
254: b48: 1f490862 fmadd d2, d3, d9, d2
256: b50: 1e62294a fadd d10, d10, d2
:~ $ objdump -d ./sim_neon | egrep -n '\b(ld1|st1|ld2|st2|zip1|zip2|uzp1|uzp2|ext|tbl|tbx|add\s+v|sub\s+v|mul\s+v|eor\s+v|orr\s+v|and\s+v|f(add|mul|mla|madd))'
274: b98: 1f48280a fmadd d10, d0, d8, d10
291: bdc: 1f480020 fmadd d0, d1, d8, d0
293: be4: 1e602929 fadd d9, d9, d0
479: ecc: 4ee78610 add v16.2d, v16.2d, v7.2d
480: ed0: 4ef4844a add v10.2d, v2.2d, v20.2d
481: ed4: 4ee5845a add v26.2d, v2.2d, v5.2d
482: ed8: 4ee4845c add v28.2d, v2.2d, v4.2d
483: edc: 4ef78443 add v3.2d, v2.2d, v23.2d
484: ee0: 4ef6845b add v27.2d, v2.2d, v22.2d
485: ee4: 4ef58441 add v1.2d, v2.2d, v21.2d
486: ee8: 4ee6845d add v29.2d, v2.2d, v6.2d
487: eec: 4e9c1b5a uzp1 v26.4s, v26.4s, v28.4s
488: ef0: 4e8a1821 uzp1 v1.4s, v1.4s, v10.4s
489: ef4: 4e9d1842 uzp1 v2.4s, v2.4s, v29.4s
490: ef8: 4e9b1863 uzp1 v3.4s, v3.4s, v27.4s
492: f00: 4e5a1842 uzp1 v2.8h, v2.8h, v26.8h
493: f04: 4e411863 uzp1 v3.8h, v3.8h, v1.8h
494: f08: 4e608442 add v2.8h, v2.8h, v0.8h
495: f0c: 4e608463 add v3.8h, v3.8h, v0.8h
496: f10: 4e739c41 mul v1.8h, v2.8h, v19.8h
497: f14: 4e031842 uzp1 v2.16b, v2.16b, v3.16b
498: f18: 4e739c63 mul v3.8h, v3.8h, v19.8h
500: f20: 6e321c21 eor v1.16b, v1.16b, v18.16b
501: f24: 6e321c63 eor v3.16b, v3.16b, v18.16b
863: 1494: 4e318400 add v0.16b, v0.16b, v17.16b
872: 14b8: 4e261e01 and v1.16b, v16.16b, v6.16b
873: 14bc: 4e261ce0 and v0.16b, v7.16b, v6.16b
874: 14c0: 4e261c44 and v4.16b, v2.16b, v6.16b
875: 14c4: 4e261c65 and v5.16b, v3.16b, v6.16b
881: 14dc: 4e455824 uzp2 v4.8h, v1.8h, v5.8h
882: 14e0: 4e451821 uzp1 v1.8h, v1.8h, v5.8h
883: 14e4: 4e435802 uzp2 v2.8h, v0.8h, v3.8h
884: 14e8: 4e431800 uzp1 v0.8h, v0.8h, v3.8h
885: 14ec: 4e618481 add v1.8h, v4.8h, v1.8h
886: 14f0: 4e608440 add v0.8h, v2.8h, v0.8h
903: 1534: 0e228421 add v1.8b, v1.8b, v2.8b
910: 1550: 4e201c61 and v1.16b, v3.16b, v0.16b
911: 1554: 4e201c40 and v0.16b, v2.16b, v0.16b
914: 1560: 4e405822 uzp2 v2.8h, v1.8h, v0.8h
915: 1564: 4e401821 uzp1 v1.8h, v1.8h, v0.8h
916: 1568: 4e618440 add v0.8h, v2.8h, v1.8h
Это без использования arm_neon.h
Исходная версия steemandlinux, :
каким волшебным образом вы сможете сделать префетч СРАЗУ 8 пакетов, если у арма префетч команда один адрес выгребает?
Надо читать документацию, а не теоретизировать теорию.
и что, что есть? какой с него профит-то? отрицательный? отож, отож…
и да, оффлоады далеко не на всех платформах присутствуют. и даже без использования оффлоадов какой-то двухголовый мипс спокойно пережевывает гигабит, да… на обычном айпитейблс, без волшебного дпдк.
Ну пакеты по 1500 байт любой проц потянет, там шина в основном загружена.
и да, оффлоады далеко не на всех платформах присутствуют. и даже без использования оффлоадов какой-то двухголовый мипс спокойно пережевывает гигабит, да… на обычном айпитейблс, без волшебного дпдк.
но если хочется странного - ну можете пытаться запиливать реализацию неон в дпдк, проверять и убеждаться что прирост отрицательный, а потом геморроиться с тем чтобы дпдк нормально заработал с дхцп/пппое и т.п. на роутере))) и в результате работать оно будет ровно так же как и какой-то туполинк со стоком)))
У нас беседа не про DPDK в роутере, а про оптимизицию на роутере.
А так как вы теоретик и на практике не можете написать симуляцию, то я сделаю за вас.
:~ $ gcc -O3 -march=armv8-a -mtune=cortex-a76 -DNDEBUG -fno-tree-vectorize -fno-tree-slp-vectorize scalar_auto.c -o sim
:~ $ gcc -O3 -march=armv8-a -mtune=cortex-a76 -DNDEBUG scalar_auto.c -o sim_neon
:~ $ ./sim
Total elements: 500000000 (chunk=8000000)
scalar: 1.144 s, 437.01 M elems/s, digest=16447876457047
:~ $ ./sim_neon
Total elements: 500000000 (chunk=8000000)
scalar: 0.557 s, 897.07 M elems/s, digest=16447876457047
:~ $ objdump -d ./sim | egrep -n '\b(ld1|st1|ld2|st2|zip1|zip2|uzp1|uzp2|ext|tbl|tbx|add\s+v|sub\s+v|mul\s+v|eor\s+v|orr\s+v|and\s+v|f(add|mul|mla|madd))'
248: b30: 1f492048 fmadd d8, d2, d9, d8
254: b48: 1f490862 fmadd d2, d3, d9, d2
256: b50: 1e62294a fadd d10, d10, d2
:~ $ objdump -d ./sim_neon | egrep -n '\b(ld1|st1|ld2|st2|zip1|zip2|uzp1|uzp2|ext|tbl|tbx|add\s+v|sub\s+v|mul\s+v|eor\s+v|orr\s+v|and\s+v|f(add|mul|mla|madd))'
274: b98: 1f48280a fmadd d10, d0, d8, d10
291: bdc: 1f480020 fmadd d0, d1, d8, d0
293: be4: 1e602929 fadd d9, d9, d0
479: ecc: 4ee78610 add v16.2d, v16.2d, v7.2d
480: ed0: 4ef4844a add v10.2d, v2.2d, v20.2d
481: ed4: 4ee5845a add v26.2d, v2.2d, v5.2d
482: ed8: 4ee4845c add v28.2d, v2.2d, v4.2d
483: edc: 4ef78443 add v3.2d, v2.2d, v23.2d
484: ee0: 4ef6845b add v27.2d, v2.2d, v22.2d
485: ee4: 4ef58441 add v1.2d, v2.2d, v21.2d
486: ee8: 4ee6845d add v29.2d, v2.2d, v6.2d
487: eec: 4e9c1b5a uzp1 v26.4s, v26.4s, v28.4s
488: ef0: 4e8a1821 uzp1 v1.4s, v1.4s, v10.4s
489: ef4: 4e9d1842 uzp1 v2.4s, v2.4s, v29.4s
490: ef8: 4e9b1863 uzp1 v3.4s, v3.4s, v27.4s
492: f00: 4e5a1842 uzp1 v2.8h, v2.8h, v26.8h
493: f04: 4e411863 uzp1 v3.8h, v3.8h, v1.8h
494: f08: 4e608442 add v2.8h, v2.8h, v0.8h
495: f0c: 4e608463 add v3.8h, v3.8h, v0.8h
496: f10: 4e739c41 mul v1.8h, v2.8h, v19.8h
497: f14: 4e031842 uzp1 v2.16b, v2.16b, v3.16b
498: f18: 4e739c63 mul v3.8h, v3.8h, v19.8h
500: f20: 6e321c21 eor v1.16b, v1.16b, v18.16b
501: f24: 6e321c63 eor v3.16b, v3.16b, v18.16b
863: 1494: 4e318400 add v0.16b, v0.16b, v17.16b
872: 14b8: 4e261e01 and v1.16b, v16.16b, v6.16b
873: 14bc: 4e261ce0 and v0.16b, v7.16b, v6.16b
874: 14c0: 4e261c44 and v4.16b, v2.16b, v6.16b
875: 14c4: 4e261c65 and v5.16b, v3.16b, v6.16b
881: 14dc: 4e455824 uzp2 v4.8h, v1.8h, v5.8h
882: 14e0: 4e451821 uzp1 v1.8h, v1.8h, v5.8h
883: 14e4: 4e435802 uzp2 v2.8h, v0.8h, v3.8h
884: 14e8: 4e431800 uzp1 v0.8h, v0.8h, v3.8h
885: 14ec: 4e618481 add v1.8h, v4.8h, v1.8h
886: 14f0: 4e608440 add v0.8h, v2.8h, v0.8h
903: 1534: 0e228421 add v1.8b, v1.8b, v2.8b
910: 1550: 4e201c61 and v1.16b, v3.16b, v0.16b
911: 1554: 4e201c40 and v0.16b, v2.16b, v0.16b
914: 1560: 4e405822 uzp2 v2.8h, v1.8h, v0.8h
915: 1564: 4e401821 uzp1 v1.8h, v1.8h, v0.8h
916: 1568: 4e618440 add v0.8h, v2.8h, v1.8h
Это без использования arm_neon.h