Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.04.2017, 15:16
|
|||
|---|---|---|---|
Как попасть в кэш линию проца |
|||
|
#18+
Пытался найти инфу про кэш линии, но кроме магической цифры 64 байта на блок ничего не нашел. Поэтому решил затестить. ИсходникЗапускается два потока и в каждом изменение счетчика std::atomic<size_t> счетчики берутся из массива на разном удалении друг от друга. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. Интересовало как именно блоки берутся процом. Оказалось берутся блоки с адресов кратных 64. В тесте есть функция one_cache_line(T1* x1, T2* x2) возвращает true если обе переменные попали в одну кэшлинию. Результат std::atomic<size_t> MSVC 2015 x64 проц i7 6700K 4 ГГц delta - растояние в байтах между счетчиками compare - адреса счетчиков в памяти slow/fast - предсказание функцией one_cache_line() time - время работы каждого потока Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Интересные результаты по времени на разных процах (все без HT) ПроцессорОдна линияРазныеi7 6700K 4 ГГц3000-3800 мс455-475 мсi7 3770K 3.5 ГГц2900-3500 мс585-595 мсCore2Duo E8400 3 ГГц2700-3100 мс675-695 мс Странные цифры: в разных кэшлиниях новые процы быстрее, а если в одну попало, то почему-то наоборот. И пропорция совсем некрасивая, при попадание в одну кэшлинию тормоза в 5-7 раз, если честно не ожидал такой большой разницы. Интересный момент там где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными. Еще один тест со счетчиками volatile size_t Результат с volatile size_t Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Время такое ПроцессорОдна линияРазныеi7 6700K 4 ГГц207-230 мс143-167 мсi7 3770K 3.5 ГГц218-220 мс202-220 мсCore2Duo E8400 3 ГГц213-228 мс202-220 мс PS Как затестить обычную работу не придумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 15:59
|
|||
|---|---|---|---|
|
|||
Как попасть в кэш линию проца |
|||
|
#18+
Dima TИнтересные результаты по времени на разных процах (все без HT) ПроцессорОдна линияРазныеi7 6700K 4 ГГц3000-3800 мс455-475 мсi7 3770K 3.5 ГГц2900-3500 мс585-595 мсCore2Duo E8400 3 ГГц2700-3100 мс675-695 мс Странные цифры: в разных кэшлиниях новые процы быстрее, а если в одну попало, то почему-то наоборот. И пропорция совсем некрасивая, при попадание в одну кэшлинию тормоза в 5-7 раз, если честно не ожидал такой большой разницы. Интересный момент там где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными. 1. На новых процах уровней кэша больше - 3 а не 2: - Core2Duo E8400 - Cache 6 MB L2 - только 2 уровня - i7 3770K и i7 6700K - Cache 8 MB SmartCache - 3 уровня 2. "при попадание в одну кэшлинию тормоза в 5-7 раз" - при изменении одной кэш линии - она каждый раз гоняется от одного ядра к другому в единственном экземпляре в состоянии E-Intel / O-AMD, путь ->(запрос)L1->L2->L3->QPI->L3->L2->L1 -> (ответ) ->L1->L2->L3->QPI->L3->L2->L1-> - при изменении разных кэш линий - одна кэш линия всегда в L1 ядра-1, а вторая в L1 ядра-2, путь ->(запрос)L1(ответ)-> 3. " где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными ." где delta 0 - там вообще-то медленно как и с одинаковыми в вашем тесте test delta 32 compare 00007FF6C4041D20 00007FF6C4041D40 fast time 457 ms 457 ms test delta 0 compare 00007FF6C4041D28 00007FF6C4041D28 slow time 3072 ms 3090 ms test delta 8 compare 00007FF6C4041D28 00007FF6C4041D30 slow time 3126 ms 3136 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 16:11
|
|||
|---|---|---|---|
Как попасть в кэш линию проца |
|||
|
#18+
Вася Уткин3. " где "delta 0" это один и тот же счетчик на оба потока, по идее должно быть медленнее, но время такое же как и с разными ." Коряво написал. Хотел сказать "с разными счетчиками в одной кэш.линии". Т.е. для std::atomic<size_t> по времени без разницы менять один счетчик из разных потоков или два разных, но оба в одной кэш.линии. Ожидал что конкуренция за счетчик добавит тормозов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.04.2017, 16:16
|
|||
|---|---|---|---|
Как попасть в кэш линию проца |
|||
|
#18+
Вася Уткин- при изменении одной кэш линии - она каждый раз гоняется от одного ядра к другому в единственном экземпляре в состоянии E-Intel / O-AMD, путь ->(запрос)L1->L2->L3->QPI->L3->L2->L1 -> (ответ) ->L1->L2->L3->QPI->L3->L2->L1-> Спасибо за разъяснения. Теперь понятно почему при использовании одного общего счетчика время не добавилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2018191]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
21ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 380ms |

| 0 / 0 |
