LINUX.ORG.RU

Какой программой потестировать обмен данными CPU - RAM

 ,


0

2

Добавил в систему с двумя процами (у каждого проца 6 слотов) памяти 6 модулей по 16G к 6 ранее установленным 8G. Все модули DDR3 RDIMM. В синие слоты 16G, в черные 8G. всего 144Gb. Все модули увиделись, частота работы модулей 1333Мгц. Для процессора Xeon X5650 в трехканале скорость обмена с RAM должна быть 32 ГБ/с.

Но если потестить, то заявленной скорости не видно. Запущен только Linux.


# mbw -n 1 1024
Long uses 8 bytes. Allocating 2*134217728 elements = 2147483648 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0       Method: MEMCPY  Elapsed: 0.26653        MiB: 1024.00000 Copy: 3841.998 MiB/s
AVG     Method: MEMCPY  Elapsed: 0.26653        MiB: 1024.00000 Copy: 3841.998 MiB/s
0       Method: DUMB    Elapsed: 0.27940        MiB: 1024.00000 Copy: 3665.049 MiB/s
AVG     Method: DUMB    Elapsed: 0.27940        MiB: 1024.00000 Copy: 3665.049 MiB/s
0       Method: MCBLOCK Elapsed: 0.16093        MiB: 1024.00000 Copy: 6363.213 MiB/s
AVG     Method: MCBLOCK Elapsed: 0.16093        MiB: 1024.00000 Copy: 6363.213 MiB/s

чем тестируют ? memtest ?

★★★★

Последнее исправление: Vlad-76 (всего исправлений: 2)

Отмечу что все эти тесты сначала читают память, затем записывают - это два действия, то есть скорость получается в 2 раза меньше чем просто скорость обмена (т.е. измерится 16 если она 32). И совсем непонятно почему mcblock почти в два раза быстрее чем memcpy. mcblock это тоже memcpy только нарезанный на блоки.

Почему там не 16гб/с - не знаю.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

чем тестируют

STREAM benchmark.

Для процессора Xeon X5650 в трехканале скорость обмена с RAM должна быть 32 ГБ/с.

Наивный)
Разве что там частота памяти будет 2000+

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

материнка intel S5520UR

RAM      16384 MB
RAM      8192 MB
RAM      16384 MB
RAM      8192 MB
RAM      16384 MB
RAM      8192 MB
RAM      16384 MB
RAM      8192 MB
RAM      16384 MB
RAM      8192 MB
RAM      16384 MB
RAM      8192 MB
dmidecode -t 17
...
Handle 0x0037, DMI type 17, 27 bytes
Memory Device
        Array Handle: 0x0021
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 16384 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM_F1
        Bank Locator: NODE 1 CHANNEL 2 DIMM 0
        Type: Other
        Type Detail: Synchronous
        Speed: 1333 MT/s
        Manufacturer: 0x80AD
        Serial Number: 0x2635925B
        Asset Tag: Unknown
        Part Number: HMT42GR7MFR4C-PB

Handle 0x0039, DMI type 17, 27 bytes
Memory Device
        Array Handle: 0x0021
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM_F2
        Bank Locator: NODE 1 CHANNEL 2 DIMM 1
        Type: Other
        Type Detail: Synchronous
        Speed: 1333 MT/s
        Manufacturer: 0x0198
        Serial Number: 0xE8295316
        Asset Tag: Unknown
        Part Number: 9965516-045.A00LF
Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от Vlad-76
# dmidecode -t 17 | grep -E "Size|Bank"
        Size: 16384 MB
        Bank Locator: NODE 0 CHANNEL 0 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 0 CHANNEL 0 DIMM 1
        Size: 16384 MB
        Bank Locator: NODE 0 CHANNEL 1 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 0 CHANNEL 1 DIMM 1
        Size: 16384 MB
        Bank Locator: NODE 0 CHANNEL 2 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 0 CHANNEL 2 DIMM 1
        Size: 16384 MB
        Bank Locator: NODE 1 CHANNEL 0 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 1 CHANNEL 0 DIMM 1
        Size: 16384 MB
        Bank Locator: NODE 1 CHANNEL 1 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 1 CHANNEL 1 DIMM 1
        Size: 16384 MB
        Bank Locator: NODE 1 CHANNEL 2 DIMM 0
        Size: 8192 MB
        Bank Locator: NODE 1 CHANNEL 2 DIMM 1
Vlad-76 ★★★★
() автор топика
Последнее исправление: Vlad-76 (всего исправлений: 1)

MemTest - Memory: Size & Speed?

memtest показывает скорость чтения. ramsmp из ссылки выше — это ramspeed, http://alasir.com/software/ramspeed/, но не знаю, насколько живой сайт. Пакетом есть в gentoo и arch.

обмена с RAM должна быть 32 ГБ/с.

А вот тут вы можете надолго погрузиться в процесс кручения таймингов, перетыкания плашек. Докатиться до установки винды с PassMark, Aida64 и пр.

mky ★★★★★
()

Для процессора Xeon X5650 в трехканале скорость обмена с RAM должна быть 32 ГБ/с.

В теории. Где сферические кони в вакууме натягивают сову на глобус. И то, это НА СОКЕТ, на весь.
На практике есть ограничения от ядра и контроллера памяти. Максимальная теоретическая ПСП для одного ядра будет равна ширине кешлайна помноженной на число LFB и делённой на латентность памяти.
Так что люди получают на ядро 12Гб/c и то рады.

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

И я не нашел в man ни слова о том, что он может проверить многоканальный режим

ИМХО, для этого бенчмарк должен знать о размещении банков памяти по каналам и явно это учитывать. А mbw просто тестирует скорость памяти

Возможно, если выдать ему под тесты почти всю память, что-то и получится

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

И совсем непонятно почему mcblock почти в два раза быстрее чем memcpy

Возможно, повезло и блоки попали в разные каналы

Посмотрел на своем железе (везде двухканальный режим, по одной плашке на канал)

  • на ddr4 mcblock везде существенно быстрее
  • на ddr5 медленнее, чем dumb, и сравнимо с copy. Но ddr5 у меня только на китайском кубике beelink, может там что ограничивает
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Вот его исходник https://github.com/raas/mbw/blob/master/mbw.c там функция worker() делает сам бенчмарк, если убрать измерители времени и прочее несущественное то оно сводится к вот чему:

worker(ullong count, long *a, long *b, , ullong block_size)
numbytes = count*sizeof(long);

dumb:
        for(t=0;t<count;t++) b[t]=a[t];

memcpy:
        memcpy(b, a, numbytes);

mcblock:
        char *src=a, *dst=b;
        for (t=numbytes; t >= block_size; t-=block_size){
            memcpy(dst, src, block_size);
            src+=block_size, dst+=block_size;
        }
        if(t) memcpy(dst, src, t);
Тупой цикл с поэлементным присваиванием может быть быстрее memcpy (у тебя на ddr5), а от нарезания memcpy на куски (безо всякого распараллеливания) меняется его скорость? Я что-то упустил?

Хотя, по поводу первого есть предположение: компилятор мог оптимизировать цикл с учётом всего что можно учесть, в макисмально эффективный для того проца код, а memcpy напримре вызывается какое-то «дефолтное для всех» из предкомпилированной библиотеки и поэтому медленнее. Но так ли это я не знаю.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax
        for (t=numbytes; t >= block_size; t-=block_size){
            memcpy(dst, src, block_size);

а от нарезания memcpy на куски (безо всякого распараллеливания) меняется его скорость?

Странно. Это единственный вариант теста? Может компилятор что распараллелил без спроса, или сам memcpy что-то может?

  1. ddr4, 2400 MT/s (память PC4-21300, но процессор в ноуте умеет только PC4-19200)
root@calypso:~# mbw -n 1 $((10*1024))
Long uses 8 bytes. Allocating 2*1342177280 elements = 21474836480 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0       Method: MEMCPY  Elapsed: 1.79341        MiB: 10240.00000        Copy: 5709.806 MiB/s
AVG     Method: MEMCPY  Elapsed: 1.79341        MiB: 10240.00000        Copy: 5709.806 MiB/s
0       Method: DUMB    Elapsed: 1.00673        MiB: 10240.00000        Copy: 10171.576 MiB/s
AVG     Method: DUMB    Elapsed: 1.00673        MiB: 10240.00000        Copy: 10171.576 MiB/s
0       Method: MCBLOCK Elapsed: 0.68190        MiB: 10240.00000        Copy: 15016.777 MiB/s
AVG     Method: MCBLOCK Elapsed: 0.68190        MiB: 10240.00000        Copy: 15016.777 MiB/s
  1. ddr4, 3200 MT/s (PC4-25600)
root@europe:~# mbw -n 1 $((10*1024))
Long uses 8 bytes. Allocating 2*1342177280 elements = 21474836480 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0       Method: MEMCPY  Elapsed: 1.26356        MiB: 10240.00000        Copy: 8104.068 MiB/s
AVG     Method: MEMCPY  Elapsed: 1.26356        MiB: 10240.00000        Copy: 8104.068 MiB/s
0       Method: DUMB    Elapsed: 0.72695        MiB: 10240.00000        Copy: 14086.328 MiB/s
AVG     Method: DUMB    Elapsed: 0.72695        MiB: 10240.00000        Copy: 14086.328 MiB/s
0       Method: MCBLOCK Elapsed: 0.54378        MiB: 10240.00000        Copy: 18830.972 MiB/s
AVG     Method: MCBLOCK Elapsed: 0.54378        MiB: 10240.00000        Copy: 18830.972 MiB/s`
  1. ddr5, 5600 MT/s (предположительно, PC5-44800)
root@io:~# mbw -n 1 $((10*1024))
Long uses 8 bytes. Allocating 2*1342177280 elements = 21474836480 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0	Method: MEMCPY	Elapsed: 0.68394	MiB: 10240.00000	Copy: 14972.095 MiB/s
AVG	Method: MEMCPY	Elapsed: 0.68394	MiB: 10240.00000	Copy: 14972.095 MiB/s
0	Method: DUMB	Elapsed: 0.41312	MiB: 10240.00000	Copy: 24787.047 MiB/s
AVG	Method: DUMB	Elapsed: 0.41312	MiB: 10240.00000	Copy: 24787.047 MiB/s
0	Method: MCBLOCK	Elapsed: 0.51843	MiB: 10240.00000	Copy: 19752.020 MiB/s
AVG	Method: MCBLOCK	Elapsed: 0.51843	MiB: 10240.00000	Copy: 19752.020 MiB/s
router ★★★★★
()
Ответ на: комментарий от router

Странно. Это единственный вариант теста? Может компилятор что распараллелил без спроса, или сам memcpy что-то может?

Да, да там вся прога максимально простая, состоит из парсинга аргументов, запуска этого теста и вывода результатов. Сам посмотри.

Компилятор без спроса по-моему треды не может создавать. Наверно может всякие SSE/AVX включать или выключать в зависимости от опций.

А если бы сам memcpy мог - наоборот логично было бы ожидать самый быстрый вариант если ему дать сразу весь кусок, чтобы он именно его оптимизировал, зная полную задачу.

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

Один поток не способен использовать всю пропускную способность памяти. Для Интел чипов, ограничение лежит в пропускной способности ядра, точнее узкого подключения ядра к NoC - сети, соединяющей ядра между собой и с остальными устройствами. Возьмите многопоточную версию STREAM, убедитесь, что запускаете несколько потоков и что эти потоки выполняются на разных ядрах. Тогда рост пропускной способности станет линейным с увеличением количества потоков до примерно 8-16 потоков. Потом начнёт выравниваться.

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

Думаю достаточно посмотреть скомпилированный асм и всё станет ясно.

Я взял этот исходник https://github.com/raas/mbw/blob/master/mbw.c скомпилировал его (gcc -o mbw -Wall mbw.c) и запускаю (только 20гигов памяти на тест у меня нет, запустил с 2 гигами)

$ ./mbw -n 1 1024
Long uses 8 bytes. Allocating 2*134217728 elements = 2147483648 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0	Method: MEMCPY	Elapsed: 0.27889	MiB: 1024.00000	Copy: 3671.725 MiB/s
AVG	Method: MEMCPY	Elapsed: 0.27889	MiB: 1024.00000	Copy: 3671.725 MiB/s
0	Method: DUMB	Elapsed: 0.87318	MiB: 1024.00000	Copy: 1172.730 MiB/s
AVG	Method: DUMB	Elapsed: 0.87318	MiB: 1024.00000	Copy: 1172.730 MiB/s
0	Method: MCBLOCK	Elapsed: 0.39930	MiB: 1024.00000	Copy: 2564.481 MiB/s
AVG	Method: MCBLOCK	Elapsed: 0.39930	MiB: 1024.00000	Copy: 2564.481 MiB/s

-O1

0	Method: MEMCPY	Elapsed: 0.28937	MiB: 1024.00000	Copy: 3538.759 MiB/s
AVG	Method: MEMCPY	Elapsed: 0.28937	MiB: 1024.00000	Copy: 3538.759 MiB/s
0	Method: DUMB	Elapsed: 0.38639	MiB: 1024.00000	Copy: 2650.165 MiB/s
AVG	Method: DUMB	Elapsed: 0.38639	MiB: 1024.00000	Copy: 2650.165 MiB/s
0	Method: MCBLOCK	Elapsed: 0.38571	MiB: 1024.00000	Copy: 2654.824 MiB/s
AVG	Method: MCBLOCK	Elapsed: 0.38571	MiB: 1024.00000	Copy: 2654.824 MiB/s

-O3

0	Method: MEMCPY	Elapsed: 0.27191	MiB: 1024.00000	Copy: 3765.966 MiB/s
AVG	Method: MEMCPY	Elapsed: 0.27191	MiB: 1024.00000	Copy: 3765.966 MiB/s
0	Method: DUMB	Elapsed: 0.38225	MiB: 1024.00000	Copy: 2678.882 MiB/s
AVG	Method: DUMB	Elapsed: 0.38225	MiB: 1024.00000	Copy: 2678.882 MiB/s
0	Method: MCBLOCK	Elapsed: 0.38200	MiB: 1024.00000	Copy: 2680.642 MiB/s
AVG	Method: MCBLOCK	Elapsed: 0.38200	MiB: 1024.00000	Copy: 2680.642 MiB/s
В целом как и ожидается - dumb самый медленный и ускоряется от -O, memcpy самый быстрый, mcblock медленнее чем memcpy.

Может у тебя патченый mbw с мультитредом? Попробуй с тем что на гитхабе.

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

Уточнение: -O1 и -O3 с учётом погрешностей одинаковые (если много раз запускать), mcblock и dump, при включённой оптимизации, тоже одинаковые друг с другом. memcpy видимо одинаковый вообще вне зависимости от наличия оптимизаций.

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

В целом как и ожидается - dumb самый медленный и ускоряется от -O, memcpy самый быстрый, mcblock медленнее чем memcpy.

Думается мне что на длинных копиях тягаться с libc’шным memcpy() сложно, если не сказать нереально. Можно было какие-то такты отыграть отсушив интринзики напрочь (-fno-builtin-memcpy), но сильно сомневаюсь чтобы это существенно на результатах сказалось.

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

В debian вроде тот же источник, но версия старая (1.2.2)

С новой версией скорость DUMB и MCBLOCK ниже, чем у COPY

Вот и верь после этого бенчмаркам :)

# from debian:

nobody@io:/tmp$ /usr/bin/mbw -n 1 $((10*1024))
Long uses 8 bytes. Allocating 2*1342177280 elements = 21474836480 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0       Method: MEMCPY  Elapsed: 0.69977        MiB: 10240.00000        Copy: 14633.338 MiB/s
AVG     Method: MEMCPY  Elapsed: 0.69977        MiB: 10240.00000        Copy: 14633.338 MiB/s
0       Method: DUMB    Elapsed: 0.41086        MiB: 10240.00000        Copy: 24923.635 MiB/s
AVG     Method: DUMB    Elapsed: 0.41086        MiB: 10240.00000        Copy: 24923.635 MiB/s
0       Method: MCBLOCK Elapsed: 0.50444        MiB: 10240.00000        Copy: 20299.618 MiB/s
AVG     Method: MCBLOCK Elapsed: 0.50444        MiB: 10240.00000        Copy: 20299.618 MiB/s
nobody@io:/tmp$ 


# from source:

nobody@io:/tmp$ ./mbw -n 1 $((10*1024))
Long uses 8 bytes. Allocating 2*1342177280 elements = 21474836480 bytes of memory.
Using 262144 bytes as blocks for memcpy block copy test.
Getting down to business... Doing 1 runs per test.
0       Method: MEMCPY  Elapsed: 0.40565        MiB: 10240.00000        Copy: 25243.250 MiB/s
AVG     Method: MEMCPY  Elapsed: 0.40565        MiB: 10240.00000        Copy: 25243.250 MiB/s
0       Method: DUMB    Elapsed: 1.30001        MiB: 10240.00000        Copy: 7876.838 MiB/s
AVG     Method: DUMB    Elapsed: 1.30001        MiB: 10240.00000        Copy: 7876.838 MiB/s
0       Method: MCBLOCK Elapsed: 0.58413        MiB: 10240.00000        Copy: 17530.344 MiB/s
AVG     Method: MCBLOCK Elapsed: 0.58413        MiB: 10240.00000        Copy: 17530.344 MiB/s
router ★★★★★
()
Ответ на: комментарий от VIT

stream:

Собрал 2 версии, со стандартным STREAM_ARRAY_SIZE (10000000) и побольше (в 10 раз. больше не дает собрать -DSTREAM_ARRAY_SIZE=100000000). хотя собирал на виртуалке, может там какие проверки текущего объема памяти

  • 1 модуль памяти. дефолтный STREAM_ARRAY_SIZE
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           19298.0     0.008366     0.008291     0.008428
Scale:          19027.7     0.008513     0.008409     0.008737
Add:            21586.7     0.011165     0.011118     0.011318
Triad:          21900.0     0.011003     0.010959     0.011087
  • 1 модуль памяти, большой STREAM_ARRAY_SIZE
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           28234.7     0.056801     0.056668     0.057077
Scale:          19087.6     0.084228     0.083824     0.084633
Add:            22022.0     0.109149     0.108982     0.109383
Triad:          22044.6     0.109268     0.108870     0.109693
  • 2 модуля памяти, стандартный STREAM_ARRAY_SIZE
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           36731.7     0.004444     0.004356     0.004759
Scale:          35778.0     0.004616     0.004472     0.004843
Add:            40672.0     0.006010     0.005901     0.006254
Triad:          41166.0     0.005877     0.005830     0.005926
  • 2 модуля памяти, большой STREAM_ARRAY_SIZE
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           57521.2     0.028193     0.027816     0.028560
Scale:          35987.4     0.044793     0.044460     0.045488
Add:            41098.8     0.059029     0.058396     0.059588
Triad:          41139.6     0.058818     0.058338     0.059248

для стандартного размера было

-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 16
Number of Threads counted = 16
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 3292 microseconds.
   (= 3292 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.

для большого размера было

This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 100000000 (elements), Offset = 0 (elements)
Memory per array = 762.9 MiB (= 0.7 GiB).
Total memory required = 2288.8 MiB (= 2.2 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 16
Number of Threads counted = 16
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 31087 microseconds.
   (= 31087 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
router ★★★★★
()
Ответ на: комментарий от VIT

скорее, баг старой версии

в пакете из дебиана:

router@calypso:~$ eu-readelf -n /usr/bin/mbw | grep Build.ID
    Build ID: c9ff8560129f4db44300cc3ddf64f5969c09cef6

router@calypso:~$ nm ~/.cache/debuginfod_client/c9ff8560129f4db44300cc3ddf64f5969c09cef6/debuginfo > nm.log 2>&1

router@calypso:~$ grep -C1 memcpy nm.log 
00000000000016c0 T make_array
                 U memcpy@GLIBC_2.14
                 U mempcpy@GLIBC_2.2.5

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

Был неправ. dmidecode не покажет, в каком режиме память работает сейчас

Если оставить одну плашку, в выводе все равно будет

Memory Device
        ...
        Size: 16 GB
        ...
        Bank Locator: P0 CHANNEL A

Memory Device
        ...
        Bank Locator: P0 CHANNEL B

других способов пока не знаю

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

Интересно, код моего бывшего студента используется для STREAM. Неплохо для Джеффа.

Размер массива маловат. Какая память и какой процессор используется?

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

Интересно, код моего бывшего студента используется для STREAM. Неплохо для Джеффа.

Скорее, наоборот. Он залил код на гитхаб, т.к. у оригинала был только ftp

Размер массива маловат. Какая память и какой процессор используется?

процессор AMD Ryzen 9 7940HS, память 2 x 16 GiB PC5-44800

Размер массива, насколько я понял, задается при компиляции. и больше 100m не дает выбрать:

router@ubuntu2204-i1:~/src/STREAM$ make stream_c.exe
gcc -O2 -fopenmp -DSTREAM_ARRAY_SIZE=200000000 stream.c -o stream_c.exe
/tmp/ccOAYW5S.o: in function `main._omp_fn.7':
stream.c:(.text+0x42): relocation truncated to fit: R_X86_64_PC32 against `.bss'
/tmp/ccOAYW5S.o: in function `main._omp_fn.6':
stream.c:(.text+0xcd): relocation truncated to fit: R_X86_64_PC32 against `.bss'
/tmp/ccOAYW5S.o: in function `main._omp_fn.4':
stream.c:(.text+0x1db): relocation truncated to fit: R_X86_64_PC32 against `.bss'
/tmp/ccOAYW5S.o: in function `main._omp_fn.3':
stream.c:(.text+0x236): relocation truncated to fit: R_X86_64_PC32 against `.bss'
/tmp/ccOAYW5S.o: in function `main._omp_fn.2':
stream.c:(.text+0x2ba): relocation truncated to fit: R_X86_64_PC32 against `.bss'
/tmp/ccOAYW5S.o: in function `checkSTREAMresults':
stream.c:(.text+0x57b): relocation truncated to fit: R_X86_64_PC32 against `.bss'
stream.c:(.text+0x9cc): relocation truncated to fit: R_X86_64_PC32 against `.bss'
collect2: error: ld returned 1 exit status
make: *** [Makefile:15: stream_c.exe] Error 1
router ★★★★★
()
Последнее исправление: router (всего исправлений: 3)
Ответ на: комментарий от router

А да, там два бага. По крайней мере в 1.2.2 из дебиана 11.

1) неправильный порядок тестов, memcpy и dumb перепутаны местами, первый на самом деле dumb

2) mcblk - выход за пределы массива если размер памяти не кратен blocksize, но с дефолтным 256кб блоком это невозможно

Так что memcpy у тебя 25гб/с в обоих, а остальные скорее всего отличаются из-за разной оптимизации при компилировании.

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

Нужно «играть» с моделью памяти. Смотрите опции компилятора. Я конечно не помню для всех возможных версий, но вот для

clang -O3 -fopenmp -mcmodel=large -mavx2 -ffp-contract=fast -fnt-store -funroll-loops

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

Он залил код на гитхаб, т.к. у оригинала был только ftp

Джон уже устал.

AMD Ryzen 9 7940HS

Не нужно использовать HT, это сильно ухудшает планирование инструкций. Для этого теста, количество потоков должно быть равно количеству ядер. В вашем случае 8. AVX2 вполне достаточно, AVX512 всё равно недоделано.

память 2 x 16 GiB PC5-44800

2 канала, DDR5-5600, должно быть 5600 MT/s * 64 bit/T / 8 bit/Byte * 2 channels = 89.6 GB/s.

У вас используется только один канал или слишком маленький размер массивов или не 5600 или я ещё могу что-нибудь придумать.

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

Для Intel компилятора я использую

icx -O3 -fopenmp -mcmodel=large -ffp-contract=fast -funroll-loops -mavx512f -mprefer-vector-width=512
export OMP_PLACES="{0:16:3},{52:16:3}"   # 32 threads, 16 per socket

Вам нужно «{0:8:1}».

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

я ещё могу что-нибудь придумать.

Упирается в ПСП между L3 и Infinity Fabric. Там всего 32 байта на такт.
Не забываем, что это APU. Там ещё встроенная графика сидит на этом же контроллере памяти, причём у неё аж целых 4*32 байта за такт.

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

А это не важно на больших массивах (а мы же ОЗУ тестируем).
Оно всё равно упрётся в этот линк между блоком ядер и инфинити фабриком.

Плюс эффективность контроллера у Zen4 в районе 75%. То есть от теоретических 89.6 останется где-то 67-68 реальных.

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

А это не важно на больших массивах

Поэтому я первым делом предложил увеличить массивы хотя бы до 50% доступного объёма.

Оно всё равно упрётся в этот линк между блоком ядер и инфинити фабриком.

Это верно. Вот только это не один линк. Каждый CCX имеет ограничение, каждый CCD имеет ограничение. Прежде чем углубляться в дебри конкретной Zen архитектуры, я предлагаю сначало корректно запустить тест. Там посмотрим. Ну и правильно расчитать, что ожидается получить. Это уже сделано.

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

Нет, L3 (в терминах Intel LLC - Last Level Cache) выполнен в виде банков на тех же отпечатках (dyes), что и ядра. В этом легко убедиться. Возмите любую серию чипов от, скажем 4 ядер до 24 ядер и посмотрите размер LLC. Он будет пропорционален количеству отпечатков ядер. Отпечатки выключаются целиком - ядра вместе со всей обвязкой, включая соответсвующие LLC банки. AMD следует этому же принципу.

VIT ★★
()