Свежие комментарии
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 (на полугигабайте данных) Это все при одних и тех же параметрах компилятора, только я забыл посмотреть каких :) Надо код читать, но его реально дохрена и лень. |
До меня доперло. Вы же на четырех ядрах упражнялись. А я - |
До меня доперло. Вы же на четырех ядрах упражнялись. А я - на одном. Собственно, в регистре 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 байта. А так как надо и экспоненту и логарифм, то значит надо пополам делить? Плюс еще ветвление и если оно случилось, то всякий blendps (а проверка всяко есть). Ну то есть интеловские/ispc-шные 700Mb/sec получаются вполне адекватными. |
Да, про нолики ошибся на 3 штуки, выше написал :) |
Да, про нолики ошибся на 3 штуки, выше написал :) |
Ну да, все так и делают. Либо по месту дотачивают (для нужно |
Ну да, все так и делают. Либо по месту дотачивают (для нужной области входных значений), либо в общем виде. В исходниках ispc, кстати, лежат готовые полиномы (которые потом попадают на вход компилятору и превращаются в инлайны). Вот тут, во второй половине файла: https://github.com/ispc/ispc/blob/master/stdlib.ispc Только вот насчет e+11 - вы нолики не перепутали? |
А нет, вру. Ошибся с расчетами. 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 блока (и поставить флаг, чтобы потом плюнуть дальше) нельзя, все валится. Собственно, оно неудивительно: исключения сворачивают стек, это и так довольно нетривиальный механизм, а тут внезапно стеков становится много, отчего может быть только порча. |
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...) для поля структуры. |
OpenCL хотя-бы VEX-prefix команды генерирует, а эта - нет. |
OpenCL хотя-бы VEX-prefix команды генерирует, а эта - нет. |
У меня макбукпро, если и |
У меня макбукпро, если и когда буду менять - то тоже только на apple. |
Кстати, чем он опять же тоже похож на бету OpenCL - это неис |
Кстати, чем он опять же тоже похож на бету OpenCL - это неиспользование AVX. |
Мля, аж слюнки текут. Жду не |
Мля, аж слюнки текут. Жду не дождусь когда буду ноут менять - меня он в принципе устраивает. Но сцука в нём IDE, искать SSD IDE не хочется, а тем более вкладываться в заведомо устаревшую вещь. |
Не, я не говорю что его нужно |
Не, я не говорю что его нужно усложнять. сам язык трогать не надо. (ох чувствую придёт C++0x через пару лет с его блэк джэком и шлюхами - будет весело). |
Не-не, C++ гнать надо из |
Не-не, C++ гнать надо из этого места. Слишком сложный язык, его усложнять не надо дальше (параллельностью). И с SIMD то же самое будет и на том же самом месте. Ну хоть exceptions возьмите для примера..... |
Насколько я понимаю, ArBB - это map-reduce над векторами, ну |
Насколько я понимаю, ArBB - это map-reduce над векторами, ну в первом приближении. А ispc - это совсем другое. Оно не над векторами, оно над скалярами, просто берет этих скаляров по 4(8) в ряд. |
просто OpenCL, в некоторых |
просто OpenCL, в некоторых случаях слишком жирно, даже если не забывать смотреть что память единая, и можно дополнительно не копировать. Например тот же оверхед на установку параметров ядрам и их запуск.. |
Ну, по идее, если оно делает |
Ну, по идее, если оно делает циклу unroll, то дальше само уже должно придумать. всё же unroll'а не достаточно, что бы компилятор поверил в то, что итерации можно simd. А вот ispc, да я как раз про это и говорил, спасибо за наводку! Но всё же я бы предпочёл прагмы встроенные в C++ компиляторы по типу OpenMP, чем отдельный компилятор(но хотя у этого метода тоже есть свои плюсы) |
Pages
