Обновить
19
0.5

Пользователь

Отправить сообщение

Стероидный велосипед: векторная алгебра, на ассемблере, в Delphi

Время на прочтение30 мин
Охват и читатели8.2K

Некоторое время назад понадобилось мне в одной Delphi-шной программе много посчитать, но расчеты шли как-то подозрительно долго. Переписывать около 100 kLOC не хотелось- особенно из-за наличия большого количества форм, но предыдущий мой опыт показывал, что если код расчетов перекомпилировать в Lazarus'е (с FPC3.0.4)- то скорость счета возрастает до 2-х раз, и поэтому было очевидно, что конкретно в данном случае компилятор Embarcadero (разных версий) сильно несилен, и надо его менять. С другой стороны, IDE от Embarcadero для рисования GUI- вне конкуренции, а их компилятор на редкость быстрый (оно и понятно- быстро+плохо, или медленно+хорошо). Но ведь вкус кактуса неимоверно притягателен. Профайлинг подручными средствами (tinyprofiler) во всех случаях показывал, что основное время (90%) занимают операции векторной алгебры над большими массивами чисел, а быстрый тест производительности этих процедур показал, что на операциях с этой алгеброй общая "пропускная способность" имевшегося математического ядра составляет для операций типа умножения векторов и скалярных произведений- ~4 ГБ/с, для умножения вектора на матрицу- 1,5-2 ГБ/с, а вот для операций обращения матрицы- проседает до 360 МБ/с (на Core I5 4460 и на Xeon 2660V2, DDR3-1866). Внутре рядом с неонкой используются только 3-х и 4-х мерные вектора и матрицы. В голову пришла мысль, что 4х4 матрица- должна целиком влезать в SSE-регистры процессора и для нее SIMD- очень желательны, а в компилятор Delphi SIMD не завезли, кажется не завезут, и вообще- дальше нижней половины XMM0 не используют. В итоге нарисовалась очень простая задача- реализовать быструю векторную алгебру в минимальном объеме для 3D/4D векторов своими руками- то есть, соорудить стероидный велосипед, о котором в заголовке написано.

И вот здесь мой навык гуглинга дал сбой- мне предлагали купить проприетарные библиотеки, в которых все уже есть, или примеры векторных операций с FP32 на SSE, но нужного FP64 - нету! Под катом- как на SSE руками сделать операцию с вектором для расчетов какой-нибудь физики и вывернуть матрицу наизнанку.

Поиграемся с XMM-регистрами?...

Еще одно объяснение эффекта Мпембы (это про почему кипяток замерзает быстрее холодной воды)

Время на прочтение6 мин
Охват и читатели79K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Why Hot Water Freezes Faster Than Cold—Physicists Solve the Mpemba Effect".


От переводчика: всю жизнь мучился вопросом, а тут на тебе- опять объяснили.


image


Краткое содержание: из-за наличия водородных связей в молекулах воды происходит изменение конфигурации ковалентных связей О-Н, с запасанием в них дополнительной энергии, выделяющейся при охлаждении и работающей как дополнительный подогрев, мешающий замерзанию. В горячей воде водородные связи растянуты, ковалентные не напряжены, запас энергии мал- остывание и замерзание идет быстрее. Существует некоторое характерное время tau, необходимое на формирование водородных связей, если процесс охлаждения будет идти медленно- то эффект Мпембы исчезнет. Если процесс охлаждения идет относительно быстро (до десятков минут)- то эффект выражен. Вероятно, должна быть и какая-то критическая температура, начиная с которой эффект появляется, но в статье это не отражено.

Дальше- подробнее...

Информация

В рейтинге
2 239-й
Зарегистрирован
Активность