LINUX.ORG.RU

У кого есть процессор с sse4.2? [Решено: Всем спасибо. Больше не надо!]

 


0

1

Прошу помочь, нужен вывод программы поглядеть.

git clone https://github.com/htot/crc32c.git
cd crc32c/crc32c && make && ./crc32c_test

Через секунду нажать Ctrl + C прервав вывод и показать первые 10 строчек. Если там будет вывод, если я не путаю если всё ОК вывода вообще почти не будет


Зачем

Ковыряю opemu модуль, починил сборку под 6.13+ и делаю попытки разобраться где неправильно инструкции эмулируются, но надо убедиться что проект выше тест прогоняет не с фейлом по умолчанию. А то мало ли, просто смотрю на PINSRQ и вроде как нормально всё. Короче сам пока не знаю, ковырять надо, но хотелось бы увидеть что там выводит на современном процессоре.


P.S. Раньше тестировал эмуляцию SSE4.2 на игре Black Mesa которую обновили и сломали работу на старых машинках (которые игру тянут легко), а сегодня обнаружил что игра теперь работает как раньше, сделали сборку по человечески и для человеков!

Перемещено hobbit из general

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)
~/crc32c/crc32c$ ./crc32c_test 
Testing CRC32C functions
CRC32C:
        CPUDetection: PASSED.
        KnownValues: PASSED.
        Alignment: PASSED.
PASSED

YAR ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

325 варнингов implicit-fallthrough при сборке этого чуда, плюс при линковке предупреждение

/usr/bin/ld: warning: crc_iscsi_v_pcl.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker

На AMD Ryzen 7 5700G нормально отработало

Testing CRC32C functions
CRC32C:
	CPUDetection: PASSED.
	KnownValues: PASSED.
	Alignment: PASSED.
PASSED

vel ★★★★★
()
Ответ на: комментарий от vel

Спасибо! Теперь зная что в утилите в целом всё нормально, уже не глядя на неё, понял, что модуль просто не получал данные если они в обычном регистре лежат pinsrq $0x1,%rax,%xmm1, и даже нашёл где регистры сохранены, но в rax лежит мусор какой-то :( Копаю дальше.

LINUX-ORG-RU ★★★★★
() автор топика

[Решено: Всем спасибо. Больше не надо!]

Ну уж нет! :)
На i7-7700HQ CPU @ 2.80GHz:

$ ./crc32c_test
Testing CRC32C functions
CRC32C:
        CPUDetection: PASSED.
        KnownValues: PASSED.
        Alignment: PASSED.
PASSED
$ ./crc32cbench
function                aligned bytes   MiB/sec
crc32cSlicingBy4        false   15      1586.568
crc32cSlicingBy4        false   63      1438.310
crc32cSlicingBy4        false   127     1339.786
crc32cSlicingBy4        false   191     1287.312
crc32cSlicingBy4        false   255     1275.767
crc32cSlicingBy4        false   287     1262.355
crc32cSlicingBy4        false   511     1255.407
crc32cSlicingBy4        false   1023    1246.181
crc32cSlicingBy4        false   1031    1237.703
crc32cSlicingBy4        false   4095    1243.508
crc32cSlicingBy4        false   8191    1248.662
crc32cSlicingBy4        true    16      1952.755
crc32cSlicingBy4        true    64      1526.989
crc32cSlicingBy4        true    128     1366.703
crc32cSlicingBy4        true    192     1301.767
crc32cSlicingBy4        true    256     1298.461
crc32cSlicingBy4        true    288     1269.234
crc32cSlicingBy4        true    512     1263.015
crc32cSlicingBy4        true    1024    1248.023
crc32cSlicingBy4        true    1032    1248.258
crc32cSlicingBy4        true    4096    1239.967
crc32cSlicingBy4        true    8192    1249.176
crc32cSlicingBy8        false   15      1206.712
crc32cSlicingBy8        false   63      1998.998
crc32cSlicingBy8        false   127     2112.376
crc32cSlicingBy8        false   191     2104.056
crc32cSlicingBy8        false   255     2121.474
crc32cSlicingBy8        false   287     2091.572
crc32cSlicingBy8        false   511     2081.234
crc32cSlicingBy8        false   1023    2097.275
crc32cSlicingBy8        false   1031    2102.861
crc32cSlicingBy8        false   4095    2095.728
crc32cSlicingBy8        false   8191    2085.575
crc32cSlicingBy8        true    16      1926.672
crc32cSlicingBy8        true    64      2552.226
crc32cSlicingBy8        true    128     2348.630
crc32cSlicingBy8        true    192     2277.270
crc32cSlicingBy8        true    256     2234.941
crc32cSlicingBy8        true    288     2110.234
crc32cSlicingBy8        true    512     2155.900
crc32cSlicingBy8        true    1024    2068.867
crc32cSlicingBy8        true    1032    2072.661
crc32cSlicingBy8        true    4096    2080.169
crc32cSlicingBy8        true    8192    2066.056
crc32cHardware32        false   15      4386.272
crc32cHardware32        false   63      8695.251
crc32cHardware32        false   127     9014.254
crc32cHardware32        false   191     7580.353
crc32cHardware32        false   255     7223.094
crc32cHardware32        false   287     7524.153
crc32cHardware32        false   511     6107.330
crc32cHardware32        false   1023    5114.712
crc32cHardware32        false   1031    5254.734
crc32cHardware32        false   4095    4659.205
crc32cHardware32        false   8191    4816.238
crc32cHardware32        true    16      3757.548
crc32cHardware32        true    64      7564.865
crc32cHardware32        true    128     9429.541
crc32cHardware32        true    192     7618.000
crc32cHardware32        true    256     7338.111
crc32cHardware32        true    288     7117.000
crc32cHardware32        true    512     6417.755
crc32cHardware32        true    1024    5142.343
crc32cHardware32        true    1032    5113.689
crc32cHardware32        true    4096    4690.181
crc32cHardware32        true    8192    4577.334
crc32cHardware64        false   15      6559.205
crc32cHardware64        false   63      14176.307
crc32cHardware64        false   127     16410.041
crc32cHardware64        false   191     17004.115
crc32cHardware64        false   255     17174.373
crc32cHardware64        false   287     16704.655
crc32cHardware64        false   511     14204.061
crc32cHardware64        false   1023    11846.748
crc32cHardware64        false   1031    12796.046
crc32cHardware64        false   4095    9556.264
crc32cHardware64        false   8191    9282.482
crc32cHardware64        true    16      5231.385
crc32cHardware64        true    64      13091.220
crc32cHardware64        true    128     16181.533
crc32cHardware64        true    192     17243.325
crc32cHardware64        true    256     12790.559
crc32cHardware64        true    288     10479.210
crc32cHardware64        true    512     12416.933
crc32cHardware64        true    1024    12527.614
crc32cHardware64        true    1032    12622.753
crc32cHardware64        true    4096    9680.327
crc32cHardware64        true    8192    9155.683
crc32cIntelAsm          false   15      2565.814
crc32cIntelAsm          false   63      8297.594
crc32cIntelAsm          false   127     16731.205
crc32cIntelAsm          false   191     20971.520
crc32cIntelAsm          false   255     16751.042
crc32cIntelAsm          false   287     17822.033
crc32cIntelAsm          false   511     21338.272
crc32cIntelAsm          false   1023    24722.367
crc32cIntelAsm          false   1031    23910.877
crc32cIntelAsm          false   4095    25262.136
crc32cIntelAsm          false   8191    24318.110
crc32cIntelAsm          true    16      3182.608
crc32cIntelAsm          true    64      14478.719
crc32cIntelAsm          true    128     27749.569
crc32cIntelAsm          true    192     23947.139
crc32cIntelAsm          true    256     18953.291
crc32cIntelAsm          true    288     18906.568
crc32cIntelAsm          true    512     21284.975
crc32cIntelAsm          true    1024    23674.689
crc32cIntelAsm          true    1032    23049.584
crc32cIntelAsm          true    4096    25033.615
crc32cIntelAsm          true    8192    24924.369
crc32cAdler             false   15      3116.107
crc32cAdler             false   63      10516.982
crc32cAdler             false   127     18167.606
crc32cAdler             false   191     16009.271
crc32cAdler             false   255     14673.816
crc32cAdler             false   287     15606.713
crc32cAdler             false   511     14955.038
crc32cAdler             false   1023    20156.595
crc32cAdler             false   1031    18899.247
crc32cAdler             false   4095    20187.671
crc32cAdler             false   8191    20648.087
crc32cAdler             true    16      3002.583
crc32cAdler             true    64      10263.060
crc32cAdler             true    128     17140.378
crc32cAdler             true    192     16488.158
crc32cAdler             true    256     15369.029
crc32cAdler             true    288     14859.422
crc32cAdler             true    512     14440.554
crc32cAdler             true    1024    20819.440
crc32cAdler             true    1032    20757.459
crc32cAdler             true    4096    22095.272
crc32cAdler             true    8192    20902.118
crc32cIntelC            false   15      4217.434
crc32cIntelC            false   63      15672.318
crc32cIntelC            false   127     20658.416
crc32cIntelC            false   191     22623.190
crc32cIntelC            false   255     16961.138
crc32cIntelC            false   287     17091.268
crc32cIntelC            false   511     19451.845
crc32cIntelC            false   1023    22658.517
crc32cIntelC            false   1031    22546.233
crc32cIntelC            false   4095    24162.695
crc32cIntelC            false   8191    25601.856
crc32cIntelC            true    16      3766.616
crc32cIntelC            true    64      12974.478
crc32cIntelC            true    128     22489.566
crc32cIntelC            true    192     21852.447
crc32cIntelC            true    256     17009.502
crc32cIntelC            true    288     16898.675
crc32cIntelC            true    512     20124.106
crc32cIntelC            true    1024    23079.310
crc32cIntelC            true    1032    21197.572
crc32cIntelC            true    4096    26580.400
crc32cIntelC            true    8192    26843.546

Убрал crc32cSarwate, а то «слишком большое сообщение».

dataman ★★★★★
()
Ответ на: комментарий от dataman

Спасибо! Пригодится очень даже потом и бенч, там сейчас падает на Illegal Instruction потом инструкцию/ции добавлю, буду знать какой у бенча вывод. Пока решил попытаться разобраться с CRC тестом.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от firkax

Основная репа вот

Патченая до Linux 6.12 включительно вот

Патч из второго до первого висит тут

Патченная до Linux 6.16 включительно вот

Последняя репа моя, реорганизована, убраны предупреждения, может быть сломана, я в ней экспериментирую, наверное лучше взять от Spacefish и взять у меня или поправить самому вот так или типа того

Там структурку поменяли и всё.

Сейчас модуль не передаёт значение из rax в xmm0 через _sstore_gpr64 и 32 там регистры не передаются. Пока можно вот так

inline void _sstore_gpr64 (struct pt_regs * r,ud_type_t n, uint64_t *where) {

	struct pt_regs *regs = r;
	switch (n) {
		case UD_R_RAX:
		     *where = regs->ax;
	             break;
...

И там где надо их регистра общего назначения сунуть в SIMD так
(да, я вижу что криво, и можно просто передать ssse3_obj, я просто пока как есть скопировал и всё, суть ты понял)

_sstore_gpr64 (ssse3_obj->op_obj->state,ssse3_obj->udo_src->base, &ssse3_obj->src.uint64[0]);

В ssse3_obj->op_obj->state лежат регистры (типа)

Вместо того что там сейчас в первых двух репах, сайчас там мусор выдаётся, а у меня вообще закомментировано, на тот момент чистил от варнингов, а PINSRQ у меня никогда не дёргалась и закомментированный код я думал что просто мёртвый.

Вроде всё, как-то так.


opemu это эмулятор новых процов ядерным модулем?

Почти, он чисто для SSE4.x инструкций, сам требует msse и msse2 без них пока оно даже не собирается, можно пофиксить, но я в эту сторону не смотрел. Оно мне пока не надо.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)
Ответ на: комментарий от LINUX-ORG-RU

Собиралось с помощью GNU gcc version 15.1.0 + GNU ld version 2.44-slack151 (AMD x86_64)

На старых системах тоже собирается (gcc 7.2.0 + ld 2.26.20160125 ) (intel i686)

Бенчи могу запустить.

Думаю, что сейчас трудно найти процессор x86 без sse4.2

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Бенчи могу запустить.

Выше запустили, не надо, спасибо. Разница будет лишь в производительности, цель не ускорить, а вообще заставить работать.

Думаю, что сейчас трудно найти процессор x86 без sse4.2

Ну, кому как, у меня аж два, и оба не умеют. Для некоторых программ, игры например, где SIMD идёт бесполезными вкраплениями которые ничего толком не ускоряют, но не дают запускать, эмуляция инструкций может быть нормальным решением. Но для ПО которое явно оптимизировано это уже конечно нет, тормоза будут катастрофическими.

Повторюсь Black Mesa до недавнего обновления не работала на процессорах без SSE4.2 и я на эмуляции без каких либо тормозов прошёл половину игры. Не плохо я считаю.

LINUX-ORG-RU ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.