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

Title Comment
Блин, новые горшки объявили,

Блин, новые горшки объявили, которые Sandy Bridge. Всего в два раза больше (в смысле AVX), но памяти - только два канала. То бишь вместо 25Gb/sec полосы - только 17 намеривают.

К концу года обещают 4-канальные, конечно, но ведь столько ждать - это утомиться!

Вы че?!

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

Поднял частоту памяти (и,

Поднял частоту памяти (и, заодно, процессора), процессор стал 3.2, память - 1600.

Запись выросла до 19.2GB/sec (_mm_stream_ps)

У меня не 1600, а 1500

У меня не 1600, а 1500 реально. Во всяком случае, оно так пишет про себя при загрузке.

Но, возможно, какие-то другие клоки при этом похуже.

да, load_pd это чтение.. Я

да, load_pd это чтение..
Я видел в тестах памяти SiSoftware Sandra псп памяти около 22Gb/s, и так как запись не дотягивает и до 20, решил проверить и чтение.. В итоге, в тесте Sandra, скорей всего проверяется чтение..
Мне вот интересно, почему у вас на DDR3-1600 примерно такие же результаты по записи, может нужно в биосе частоту памяти установить? Например у меня в биосе явно стоит 1333, а не авто, я по-моему это явно устанавливал.

load_pd - это же чтение

load_pd - это же чтение такое?

Ну да, с префетчем и если регистров хватает, наверное как-то так. 17gb/sec.

Чистое копирование меня интересует постольку-поскольку, хотя вот вместе с конверсией типа, скажем float в short - интересно будет попробовать.

Вот только всё равно хочу

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

значит vs2010, core i7 930, 3xDDR3-1333, ht выключен, openmp 4 потока, размер массива - 800MiB - выровнен по 64 байтам, каждый поток пишет/читает по 4 xmm(то есть 64 байта), перед началом всё инициализируется, основной цикл повторяется 16 раз

_mm_stream_pd компилируется в movntpd ~ 17Gb/s
_mm_store_pd компилируется в movapd ~ 12Gb/s
_mm_load_p компилируется в movapd ~ 21.7Gb/s

Да, касаемо таблицы, скажем для замены табличным профилям. Т

Да, касаемо таблицы, скажем для замены табличным профилям. Там на входе - триада (RGB), в некоторых случаях хочется тетраду (RGBG2). Даже если 10 бит на элемент (что гадски мало даже для линейного лукапа), получается таблица с 2^30-2^40 входов. Как-то многовато.....

Другой вопрос, что точек для оценки/построения табличного профиля берется, в лучшем случае, несколько тысяч - значит это и будут реальные узлы таблицы. А дальше - интерполяция.

У таблицы на 65k записей и просто лукап - получается точност

У таблицы на 65k записей и просто лукап - получается точность (максимальное отклонение от идеала) порядка 1% (потому что производная в некоторых местах - большая)

Если увеличивать таблицу - скорость будет падать, даже 65к записей - это уже целиком кэш L2.

То есть, как уже написано в разделе "табличный лукап": "не для того мы заводили плавающую точку, чтобы сразу округлять"

а просто таблица с прямым lookup - не? насколько я слышал (

а просто таблица с прямым lookup - не?

насколько я слышал (точно не знаю) контроллеры управления двигателями в автомобилях ничего не вычисляют вообще - работают по таблицам значений f(x, y, z) если и не большего к-ва переменных

Гугление показало следущее - у PGI-компилятора слет состоян

Гугление показало следущее
- у PGI-компилятора слет состояния MXCSR в дочерних тредах считается багом и был исправлен в 10.5
- ничего другого здравого на тему 'OpenMP MXCSR' на первых страницах выдачи не нагуглилось.

MS просит возвращать как было перед вызовом других функций за исключением вариантов "явного согласия". Ну и defaults описаны в доке.

Подозреваю, что rounding mode вообще мало кто меняет.

Хм... Тогда они, вероятно, не слетают, а возвращаются к неко

Хм... Тогда они, вероятно, не слетают, а возвращаются к некоторым дефолтным настройкам. Значит наверное должен быть какой-то метод задания дефолтных настроек, это было бы логично..

И, кстати, я подозреваю, что вообще все настройки FPU/SSE сл

И, кстати, я подозреваю, что вообще все настройки FPU/SSE слетают.

Не, ну я то изучал влияние размера интерполяционных таблиц н

Не, ну я то изучал влияние размера интерполяционных таблиц на точность, как только оно стало попадать не в те строки из-за округления, так сразу стало понятно....

Не, ну я OpenMP не то, чтобы первый раз увидел, но почти не

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

Вот, походил по грабелькам, стал опытнее.

похоже это косяк VS. если переменная read only то никаких ло

похоже это косяк VS. если переменная read only то никаких локов быть не должно. каждое ядро сделает копию в свой L2(L1) и будет её спокойно читать. возможен конфликт за доступ к общей линии L3, но это случится 1 раз, после этого каждый сделает копию себе (в случае private аналогично).
вот если read after write, тогда да, попа.
я стараюсь вообще не пользоваться private, вместо этого просто определяю локальные переменные внутри параллельного блока.

ну да, хрен догадаешься... Повезло, что отловили, дебужить т

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

Наиболее чУдным открытием оказался ресет rounding mode внутр

Наиболее чУдным открытием оказался ресет rounding mode внутри OpenMP-потока.

Вот это да - реальная жесть.

Ооо, понятно. Знакомо)) Одна беда, что все спецификации, на

Ооо, понятно. Знакомо)) Одна беда, что все спецификации, на основе которых надо работать, не начитаешься...

Спасибо за апдейт, ценное уточнение.

Все оказалось куда тупее: http://blog.lexa.ru/2010/12/29/ope

Все оказалось куда тупее: http://blog.lexa.ru/2010/12/29/openmp_intel_vs_visual_studio.html

где можно купить б.у такой

где можно купить б.у такой фотик?

Вы говорите о прямой

Вы говорите о прямой имплементации, которая на C?
Ну да, в хорошем случае она догонит Intel, если цикл суммет векторизовать, чтобы значит powf считался для 4-х элементов массива сразу.

Впрочем, попробовал. Oi и SSE2 у меня были включены, добавление _set_SSE2_enable(1) ничего не меняет: 7 мегапикселей в секунду для одного потока и 36 для OpenMP.
Это примерно втрое медленнее интеловского варианта т.к. автовекторизации не случилось (втрое а не вчетверо т.к. есть ветвления и векторизатор далек от оптимальности).

С Visual C++ забавнее другое: в один поток SSE-вариант сплайнов быстрее, чем C-шный вариант сплайнов раза в полтора-два (не в четыре, потому что скалярный вариант просто считает, а мой векторный на ~8 операций счета делает еще 8 операций для транспонирования).

А вот с OpenMP - С-шный вариант ускоряется почти вчетверо (и впрямь, чего ему), а SSE - замедляется.

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

Или треды свои самому запускать, по числу ядер....

Разбираться надо, конечно, Visual - гораздо более распространенный компилятор, чем Intel, а у меня опенсорс...

Алексей, а не пробовали

Алексей, а не пробовали просто играться в 2010й студии
с /Oi и /arch:SSE2 и/или http://msdn.microsoft.com/en-us/library/bthd138d(v=VS.100).aspx
Вдруг существует какая-то неочевидная комбинация, которая работает под OpenMP быстрее.

А что там с инвалидацией?

А что там с инвалидацией? Если она идет не по адресу, а по ассоциативному адресу, то даже с не-shared кэшем ядра будут портить малину брату.

кэша у L2-кэша (L1 то у ядер

кэша у L2-кэша (L1 то у ядер свой). Разбираться - не очень понимаю как, это место в VTune (или, если хотите, в хардверных счетчиках у i7)

У core i7 l2 не shared, l3 - shared.

http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html

Да, местами она странная. Но конкретно к movaps/movntps пре

Да, местами она странная.

Но конкретно к movaps/movntps претензий нет: т.е. интел додумал в этом месте правильную инструкцию написать, но вообще надо там писать _mm_stream_ps (о чем я теперь знаю из гугла) и сейчас я это дело изучу...

Ага, понятно, хитрО... Ну, т.е. если я правильно вас понял,

Ага, понятно, хитрО...
Ну, т.е. если я правильно вас понял, то получается что причина действительно в плохом коде... Нда...

2010 студия весьма противоречивая получилась. Крайний раз я что-то похожее помню то ли на версии VS5, то ли на первой с .NET, которая после вполне нормальной VS6 была.

У меня есть ощущение, что все

У меня есть ощущение, что все (разумные) смешивающие преобразования в RGB будут несмешивающими в Lab. Нет, ясно, что есть такая штука как Channel mixer делающая любой канал линейной комбинацией других (возможно даже в другом цветовом пространстве!) но часто ли это используют люди (кроме хардкорных последователей старого Маргулиса)? Особенно в фото а не в полиграфии?
Я, в общем, думаю свои мысли применительно к уровню выше RAW -- пост-обработка, заменф фотошопу (толстый)/лайтруму (мне там не хватает некоторых фотошоповых штук). Хотя, конечно, интеграция с RAW должна быть плотнейшая.

Даже одна матрица размером Даже одна матрица размером 248 - это уже перебор. И даже размером 236 (3-мерный сплайн по 12 бит на сторону) - тоже перебор. Т.е. смешение каналов хорошо бы сводить к линейной операции, размером 3x3, возможно с каким-то поканальным препроцессингом до и после.
Я на профиле (VTune) вижу, что сильно больше времени начинае

Я на профиле (VTune) вижу, что сильно больше времени начинает уходить на сохранение результата (в параллельной версии в сравнении с последовательной).
Там простой _mm_store_ps(&out[i],result), который транслируется в movaps

Возможно, причина в том, что это самое [i] в разных тредах очень синхронно попадает в один участок кэша у L2-кэша (L1 то у ядер свой). Разбираться - не очень понимаю как, это место в VTune (или, если хотите, в хардверных счетчиках у i7) я пока не понимаю.

Интел в этом месте делает, как уже обсуждали в соседних каментах, movntps, которые кэш не размывают.

Pages

Subscribe to comments_recent_new