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

Title Comment
попробуйте ещё IntelMKL, там есть функции аля SVML, только д

попробуйте ещё IntelMKL, там есть функции аля SVML, только для длинных векторов.

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

ArBB тоже работает над скалярами. смысл в том, чтобы писать код в "stream" терминах, явно указывать какие элементы зависимы, а какие нет. если элементы не зависимы, то делается AVX + openmp. язык примерно как у CUDA.

Ага. Но там начинаются чудеса out-of-order: out=1.055*in; -

Ага. Но там начинаются чудеса out-of-order:

out=1.055*in; - 145msec (на полугигабайте данных)
out=1.055*log(in); - 381 msec, с exp - столько же. Т.е. добавка +236
out=1.055*pow(in,1/2.4); - 800 (а ожидал бы я 381+236 = 617)
out=1.055*pow(in,1/2.4)-0.055; - 730 (т.е. меньше, хотя добавили вычитание)

Это все при одних и тех же параметрах компилятора, только я забыл посмотреть каких :)

Надо код читать, но его реально дохрена и лень.

До меня доперло. Вы же на четырех ядрах упражнялись. А я -

До меня доперло.

Вы же на четырех ядрах упражнялись. А я - на одном.
Если урезать осетра разделить вчетверо, то как раз нужные ~500-600Mb/sec у вас и получилось. У меня доходит до over 9000 720, но и мегагерцев поболее будет.

Собственно, в регистре 16 байт, 720/16 = 45 млн. обработок вектора на ядре, на четырех ядрах было бы 1.8e+8. Разница в тактовых частотах: 4500/3800 = 1.18, разница в быстродействии 1.8/1.4=1.28, получается ISPC ручной код маленько уделал :).

Правда не факт, что встроенная реализация exp(log()) у ISPC такая же точная, как обсуждаемая. Ну и скорость памяти тоже важна, просто на чтение-запись должно процентов 15 уходить.

А, даже так. Удивительно.

А, даже так. Удивительно.

О, нашел. --math-lib=fast

О, нашел.

--math-lib=fast

Экспонента и логарифм жрут одинаково примерно.

Экспонента и логарифм жрут одинаково примерно.

fast отчего-то банально медленнее у меня, чем default. Разби

fast отчего-то банально медленнее у меня, чем default. Разбираться лень :)

А, нет, тоже две. Но отчего-то не помогает :)

А, нет, тоже две. Но отчего-то не помогает :)

Увы, но для экспоненты там только одна версия, а экспонента

Увы, но для экспоненты там только одна версия, а экспонента жрет чуть меньше половины времени (проверил, заменив pow() на log())

Ну то есть есть еще куда расти: LLVM генерирует код хуже, чем написано ручками, неудивительно :)

Нет, это вместе и экспонента, и логарифм. И blendps - это не

Нет, это вместе и экспонента, и логарифм. И blendps - это небольшая добавка.

Я по той ссылке, что Вы дали ниже, вот что увидел: else if (__math_lib == __math_lib_ispc_fast)

Посмотрите, там наверняка есть настройка, какую математическую библиотеку использовать. Наверняка если fast подкрутить, то будет побыстрее 700МБ/с.

1 float - 4 байта. Т.е. около 2Gb/sec если бы мы только экс

1 float - 4 байта.
Т.е. около 2Gb/sec если бы мы только экспоненту считали.

А так как надо и экспоненту и логарифм, то значит надо пополам делить?

Плюс еще ветвление и если оно случилось, то всякий blendps (а проверка всяко есть). Ну то есть интеловские/ispc-шные 700Mb/sec получаются вполне адекватными.

Да, про нолики ошибся на 3 штуки, выше написал :)

Да, про нолики ошибся на 3 штуки, выше написал :)

Ну да, все так и делают. Либо по месту дотачивают (для нужно

Ну да, все так и делают. Либо по месту дотачивают (для нужной области входных значений), либо в общем виде.
Помянутые libm_sse2_pow(f) и svml_powf4(8) - это почти оно и есть, разве только не инлайны, а честные функции с call (инлайны тоже бывают).

В исходниках ispc, кстати, лежат готовые полиномы (которые потом попадают на вход компилятору и превращаются в инлайны). Вот тут, во второй половине файла: https://github.com/ispc/ispc/blob/master/stdlib.ispc

Только вот насчет e+11 - вы нолики не перепутали?
Ну собственно частота 3.8*1e+9, на 16 инструкций/такт (AVX, dual issue) на 4 ядра = 2.4e+11 flop/s (при очень либеральном способе оценки), это уже в пересчете на скаляры.

А нет, вру. Ошибся с расчетами. 5,6e+8 обработанных float в

А нет, вру. Ошибся с расчетами. 5,6e+8 обработанных float в секунду.

Я несколько не в тему, но вот что привлекло мое внимание: >

Я несколько не в тему, но вот что привлекло мое внимание:

> возведение в степень, которое тоже очень медленное: на SSE/AVX такой функции нет, на FP87 есть, но безобразно медленная

Я в своей работе использую (вернее, использовал) причесанный мною код некого Julien Pommier, который написал очень быстрые (и "достаточно" точные) SSE инлайны для sin, cos, tan, exp и log.

А та же powf(in[i],1/2.4f) - это ведь exp(1/2.4f * log(in[i]))

В диапазоне (0.0001, 1] применение этих приближенных функций дает ошибку до 6,0e-8 (по сравнению с powf)

А скорость такая: На моем i5-2500, разогнанном до 3,8 ГГц при всех 4 ядрах я получил 1,4e+11 обработок 4-компонентных векторов, или 5,6e+11 обработанных float. OpenMP использовал для загрузки всех 4 ядер.

Финт может и сработает, не

Финт может и сработает, не пробовал. Я бы на месте компилятора от алиасинга просто с ума бы сошел.

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

Проблема в том, что если вызывается что-то чужое, что может выплюнуть исключение (а это же в духе C++, особенно для библиотек, даже new может плюнуть исключением если не удалось аллоцировать), то остается только сливать воду, других вариантов нет: перехватить его внутри OpenMP блока (и поставить флаг, чтобы потом плюнуть дальше) нельзя, все валится.
Заворачивать внутренности треда в try нельзя (точнее, я пробовал и конкретно на gcc у меня не вышло)

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

1) int &t=mystruct.a; Такой

1) int &t=mystruct.a;

Такой финт не сработает?

2) можно ловить exceptions внутри блока (то есть весь код трэда, будет завёрнут в try ()) сохранять их куда-то, и потом уже кидать их вне многонитевого кода. Конечно тут есть свои ограничения (на типы исключений), но это не вина C++. В смысле тот же ispc если и будет многонитвевым, исключений он вообще не будет давать(и опять же придётся делать то что вы описали - играться с флагами, errorState и т.п. в C-style) - в C++ хоть какие-то exceptions, но есть.

Про практическую пользу не знаю. Но старые команды я легко г

Про практическую пользу не знаю.
Но старые команды я легко глазом читаю, а эти - пока еще нет.

AVX "скоро скоро" обещают и там и там.

Да, я, кстати, обратил внимание. А есть от этого практическа

Да, я, кстати, обратил внимание. А есть от этого практическая польза прям сейчас? Или это лишь дает нам знать, что внедрение AVX инструкций в Intel OpenCL потребует не так много ресурсов?

С++ + OpenMP

Претензий к бутерброду две

1) Нет способа указать "доступ" (shared/private...) для поля структуры.
2) с exceptions (изнутри параллельного блока) - бред (и если оно надо, то приходится в блоке ставить флаг, быстро из блока выходить, а потом - флаг проверять и райзить если надо)

OpenCL хотя-бы VEX-prefix команды генерирует, а эта - нет.

OpenCL хотя-бы VEX-prefix команды генерирует, а эта - нет.

У меня макбукпро, если и

У меня макбукпро, если и когда буду менять - то тоже только на apple.

Кстати, чем он опять же тоже похож на бету OpenCL - это неис

Кстати, чем он опять же тоже похож на бету OpenCL - это неиспользование AVX.

Мля, аж слюнки текут. Жду не

Мля, аж слюнки текут. Жду не дождусь когда буду ноут менять - меня он в принципе устраивает. Но сцука в нём IDE, искать SSD IDE не хочется, а тем более вкладываться в заведомо устаревшую вещь.
Кстати о ноутах, вы какие предпочитаете?
Я как начал использовать ASUS - так всем теперь советую - качество хорошее. У всех кто пользуется, проблем нету (хотя у знакомых людей с другими фирмами есть проблемы.. но хз, конечно выборка маловата)..
Но в последнее время тянет к Lenovo ThinkPad (типа T420), наверное из-за брутальности их вида, хз как у них с качеством.

Не, я не говорю что его нужно

Не, я не говорю что его нужно усложнять. сам язык трогать не надо. (ох чувствую придёт C++0x через пару лет с его блэк джэком и шлюхами - будет весело).
Просто добавить прагму как extension в компилятор.
А что кстати с OpenMP не так? Мне беглого поверхностного изучения хватило для использования, и грабли ещё не встречались.
Не хотите в C++, пусть в C - для меня главное чтобы под рукой было.
Просто как-то не кайф иметь лишний dependence для сборки, ну чисто субъективно.

Не-не, C++ гнать надо из

Не-не, C++ гнать надо из этого места. Слишком сложный язык, его усложнять не надо дальше (параллельностью).
Достаточно вспомнить про сочетание C++ и OpenMP.

И с SIMD то же самое будет и на том же самом месте. Ну хоть exceptions возьмите для примера.....

Насколько я понимаю, ArBB - это map-reduce над векторами, ну

Насколько я понимаю, ArBB - это map-reduce над векторами, ну в первом приближении.
Это тоже ценная штука и многие вещи закроет (и как только будет не в бете и на маке - я туда посмотрю).

А ispc - это совсем другое. Оно не над векторами, оно над скалярами, просто берет этих скаляров по 4(8) в ряд.
Принципиально важно то, что оно условные операторы вполне разумно обрабатывает (естественно, разваливая вычисления на два блока, а потом собирая маской). Не бог весть как трудно вручную, но очень уж занудно.
Работал бы с 16-бит int - цены бы не было машинке.

просто OpenCL, в некоторых

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

Ну, по идее, если оно делает

Ну, по идее, если оно делает циклу unroll, то дальше само уже должно придумать.

всё же unroll'а не достаточно, что бы компилятор поверил в то, что итерации можно simd.

А вот ispc, да я как раз про это и говорил, спасибо за наводку! Но всё же я бы предпочёл прагмы встроенные в C++ компиляторы по типу OpenMP, чем отдельный компилятор(но хотя у этого метода тоже есть свои плюсы)

Pages

Subscribe to comments_recent_new