Свежие комментарии

Title Comment
это ж последовательный доступ. в таком режиме кэш оч.эффекти

это ж последовательный доступ.
в таком режиме кэш оч.эффективен. (WB/prefetch асинхронно и параллельно, т.е. как бы на халяву).

кстати, а нафига нужно связываться с этими non-temporal hint ? кто-нибудь профилировал это дело, или так, от балды решили, что "будет лучше" ?

мммм... оно, кажется, ни фига не "ПОСИКС", но тем не менее,

мммм...
оно, кажется, ни фига не "ПОСИКС", но тем не менее, насколько помню, можно запросить аллокацию с "коммитом", т.е. уже помэпленный кусок.
может, кстати, и даст прирост в производительности.

нет, ты изначально рассматривал memory-to-memory copy. (напр

нет, ты изначально рассматривал memory-to-memory copy. (напр. распаковку рава.)

кстати, WC нарушает "все мыслимые" полиси работы с памятью (не гарантирован порядок того и сего, не гарантирована "когерентность" и ты.ды.), так что...

Меньше чем ожидал, но вот скорости кэшей 2-мегабайтный work

Меньше чем ожидал, но вот скорости кэшей
2-мегабайтный working set - ~20Gb/sec
80к - 28Gb/sec
все на одном ядре.
В несколько потоков параллелить бессмысленно, слишком они мелкие получаются.

Естественно, movaps а не non-temporal

Не-не, это другое. Я могу взять у системы pinned memory (не

Не-не, это другое.
Я могу взять у системы pinned memory (не факт что мне дадут полтора гига, ну значит гиг) - и тогда скорость сразу будет правильной.

А то что выдают "по умолчанию" - оно вообще никуда не помэплено (может я взял, а использовать не собираюсь) и соответственно при первом обращении в каждую страницу у меня PF.

То есть про кэш ты пишешь - это теоретически правильно, если бы у меня речь шла о мегабайтах т.е. о размерах сравнимых с размерами кэшей, то скорости были бы еще выше.

Собственно, хрен ли, с кэшом сейчас померяю тоже. В смысле, на маленьком working set, мегабайт 6

Але, мы кажется <b>запись</b> обсуждали, причем тут prefetch

Але, мы кажется запись обсуждали, причем тут prefetch?

Конечно асинхронная, если писать по 16 байт вместо 64, счаст

Конечно асинхронная, если писать по 16 байт вместо 64, счастья не будет.

Заметим в скобках, что отключение L2/L3, которым ты тут пугаешь, на скорость этой записи вообще не повлияют.

а ты отключи, и вопросы отпадут сами собой :-)) кстати, кол

а ты отключи, и вопросы отпадут сами собой :-))

кстати, коль уж кэш не при чём, то каким образом "если проинитить странички заранее, а не писать в только что выделенные, то скорость записи становится ближе к ожидаемой" ?
сам-то как думаешь ? :-))

полагаю, что prefetch для того и был придуман, чтобы уменьши

полагаю, что prefetch для того и был придуман, чтобы уменьшить кэш-промахи (а при опр. условиях и вовсе их избежать)... ты же отдаёшь себе отчёт в том, что prefetch выполняется асинхронно ? ...или таки - нет ?

тогда уж цитируй дальше: "They are delayed in an internal bu

тогда уж цитируй дальше: "They are delayed in an internal buffer ... If software cares about data being delayed developers
must deliberately empty the WC buffers"
т.е. операция записи асинхронная.
это, знаешь ли, в свою очередь ну ни фига не typical sense of the memory writing ,-)

да, кстати, таки ты выполняется ли у тебя по коду "deliberately empty the WC buffers" ? ...а ты попробуй ,-)

ну да ладно..

ну да ладно..

Он не увидит этого, это из ЖЖ

Он не увидит этого, это из ЖЖ приехало
(http://alextutubalin.livejournal.com/218527.html#comments)

ну вот видишь, сам же

ну вот видишь, сам же убедился продемонстрировал, что size cache does matter :-))

Отсыпь травы, а то мне тебя не понять..

Интел пишет нам "Writes to the WC memory type are not cached

Интел пишет нам
"Writes to the WC memory type are not cached in the typical sense of the word cached"

Чем какбэ намекает нам, что у тебя sense какой-то не typical....

И че? Думаешь 100 миллионов 16-байтных значений поместятся

И че?

Думаешь 100 миллионов 16-байтных значений поместятся в кэше?

Зачем мне его отключать то? Я щупаю реальный перформанс на р

Зачем мне его отключать то? Я щупаю реальный перформанс на реальном таком полуторагигабайтном (уже) working set

ну вот видишь, сам же <s>убедился</s> продемонстрировал, что

ну вот видишь, сам же убедился продемонстрировал, что size cache does matter :-))

а теперь отключи L2/L3 кэш и насладись результатом (и приготовься к тому, что общая производительность системы упадёт на пару порядков... т.е. запасись попкорном терпением)

Лёша, ты три тезиса связать сумеешь ? вот они: *: Move packe

Лёша, ты три тезиса связать сумеешь ?
вот они:
*: Move packed single-precision floating-point values from xmm to m128 using non-temporal hint.
*: The non-temporal hint is implemented by using a write combining (WC) memory type protocol when writing the data to memory.
*: Write-combining is a limited caching optimization (more often used for RAM on devices such as graphics cards.)

так понятней ? ,-)

// ну и про прочие prefetch & write back тоже не забываем, ага

Под виндами - VTune, на маке

Под виндами - VTune, на маке - Shark. Но на маке редко теперь работаю.

Но. с этими _mm_... - я в

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

Какой профайлер используете? VTune?

Впрочем, если проинитить странички заранее, а не писать в то

Впрочем, если проинитить странички заранее, а не писать в только что выделенные, то скорость записи становится ближе к ожидаемой: 10-11Gb/sec в один поток и 16-17Gb/sec во все ядра.

Просто _mm_store_ps(куда, чего) в цикле.

А read, три умножения и два blend, write туда-же - 10-11Gb/sec.

Концепция отличная и, по всей

Концепция отличная и, по всей видимости, для интересных мне приложений (с картинками) будет сильно производительнее на каком-то современном железе.

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

А с OpenCL/CUDA - нужно довольно большие куски переписывать. Более объемная задача.

Может быть и можно, я

Может быть и можно, я пробовал анроллить и становилось хуже.
Но я пока только учусь. Кроме того, один и тот же _mm_store_ps превращается то в mov, то в mov без кэширования, т.е. у компилятора какой-то свой ум в этом месте.

Вот кстати gpu в этом плане

Вот кстати gpu в этом плане более православные..
Вот на CPU возможно идёт некий счётный процесс, который грузит все ядра, причём кэши и регистры у него забиты впритык (например тот же gemm), мало того что из-за вклинивания всяких системных и не очень процессов регистры могут тасоваться туда-сюда, так и ещё какая-нибудь сволочь может взять да и сбросить/сожрать весь кэш.. (можно конечно отдавать ядра отдельным процессам, но всё же дёготь есть)
То есть я к тому, что концепция обособленного вычислятора(будь то gpu или larabee), достаточно не плоха. А самое главное - программисты всегда будут сыты ;)

О круто! Вот только всё равно

О круто!
Вот только всё равно хочу больше 20GiB/s, причём на своих 3xDDR3-1333 :)

Кстати, думаю не обязательно прям все значения предварительно инициализировать - можно "прогуляться" с шагом 4KiB, или что-то типа этого.. А может есть что-то ОС-зависимое, но хочется без этого..

Агабля! Второй проход той же

Агабля!

Второй проход той же инициализациями (но другими значениями, чтобы было видно что работает) - 12.3Gb/sec в один поток и 16.7 - во всю дурь.

Во, теперь похоже на правду совсем.

Ну вот результат такой

Ну вот результат такой уже:

1) Заполнение массива (1.5 гигабайта) через movntps - ~4.5Gb/sec без OpenMP и 5.8 - в 8 потоков.

2) операция вида
считать 4 float
три dot-product и два blendps
записать 4 float туда же, куда писали
4.8 Gb/sec на одном ядре и до 11.2 - на OpenMP (числом тредов не управляю).
В том смысле, что 100 мегапикселей (по 16 байт на пиксель) за 313 миллисекунд.

Возможно, действительно на 1-м шаге мне выделяют память по страничкам, лениво так. Сейчас добавлю второй проход для шага 1.

что-то маловато.. я думал

что-то маловато.. я думал если захотеть, то на core i7 можно достичь больше 20GiB/s на чтение и запись..

Может там кто-то по рукам кнутом бьёт?
Например можно попробовать два раза тест прогнать, замеряя только время второго (может calloc, но лучше всё таки один разу "вручную" заполнить).. Может там такой оверхед от ОСи - например windows реально выделяет память только под реально используемые страницы, или ещё какой кнут..

Какой нафиг кэш, если а) я пишу 600 мегабайт в тесте б) mo

Какой нафиг кэш, если
а) я пишу 600 мегабайт в тесте
б) movntps - он, типа, мимо кэша

О боже! вот уж воистину - ignorance is bliss это ты с кэшем

О боже!
вот уж воистину - ignorance is bliss

это ты с кэшем работал. убери кэш, и все времена на порядок с лишним ухудшатся.

...можешь потыкаться в гугель с запросами ras/cas, хотя бы.

Pages

Subscribe to comments_recent_new