Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2013-03-10 17:00:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
поток малосвязного бреда
прочел в одной из лекций, что когерентность кеша обеспечивает всего лишь тотальное упорядочивание операций на каждой отдельной ячейке памяти, но никак не тотальное упорядочивание операций с памятью вообще, с точки зрения того, что происходит уже за пределами процессоров (со своей системой переупорядочивания операций доступа к памяти).

Я до сего дня полагал, что когерентность кеша как раз и означает тотальное упорядочение доступа к памяти (и окружающим её кешам), т.е. то, что наличием кеша, даже и многоуровнего кеша, в многопроцессорной системе в практике программирования можно принебречь.

С другой стороны, наверное, наличием кеша можно действительно пренебречь, поскольку процессорные memory fences, видимо, должны и правильно взаимодействовать с кешами, обеспечивая те или иные гарантии консистентности и на их уровне. Я, опять же, считал, что memory fence действует исключительно внутри данного процессора, даже и до внутренних кешей не доходя.

Всё это происходит от неупорядоченного потребления информации, когда не учишь тему достаточно вглубь, но создаешь себе некоторую модель, достраивая в уме, выдумывая, недостающие детали и считая, что всё уже понимаешь. Как с этим бороться - не очень понятно. Как минимум, усердием в учебе и меньшей самоуверенностью.

Как бы, в результате, действительно, знание всех этих тонкостей для программиста не нужно было бы (хорошая реализация барьера равным образом даст нужный барьер или аналог его и компилятору, и процессору, и кешу, и блокам памяти), если бы не одно но: неупорядоченность работы кешей приводит к тому, что нет никакого тотального порядка изменения ячеек памяти - а сие уже надо осознавать и учитывать, если пишешь всерьез код на атомарных объектах. А какие относительно этого нетотального порядка доступа к памяти есть гарантии (скажем, есть ли гарантии транзитивности видимости при использовании барьеров в памяти, не обеспечивающих тотальной упорядоченности) - для меня пока-что загадка (в общем случае).

Если кто-то из читателей разбирается в модели памяти С++11, java или каких-то конкретных архитектур, буду рад комментариям и пояснениям.