Как стать автором
Обновить
13
0
Владимир Коляденко @vlanko

Программист

Отправить сообщение
Спасибо, буду смотреть
Скажите нубу, что делает это
asm("# point 2 start");
?
Кроме того, что в Фортране я совершенно не разбираюсь.
На Фортране пишут потому, что под него есть тонны математических/научных библиотек
https://benchmarksgame.alioth.debian.org/u64q/fortran.html
Фортран или на уровне чистого С, или медленнее.
Когда я начинал разбираться в вопросе в 2010м, Meep был непонятно чем. Сейчас, наверное, использовать его оптимальнее, чем самому писать на С++.
Да, я писал. Матлаб очень быстро умножает матрицы и с нормальной скоростью берет функции от массивов. Возможно, получится такое сделать. Но это потребует создание 4 новых матриц для вычитания. Боюсь, со скоростью памяти будет хуже.
Проверил такую идею. Производительность упала в 1,6 раз
Отличная оценка, спасибо за неудачную идею.
В таком способе нужно читать эпсилон 3 раза.
Вместо 5 чтений 7+лишение записи. Плюс лишняя математика.

А в Н такого и не сделаешь
Спасибо за анализ.
— Глобальный копипаст делать точно не хочу — слишком много нужно. Сделаю вызов функции или ссылку на функцию.
— exp(-pow(x, 2) — это какое-то локальное помутнение. Все квадраты расписал, а этот нет.
— exp( — (t — 1) * dt / tau), пожалуй, посчитаю заранее
— в С не шарю, именно об этом спрашивал. Но для Джавы 1-мерный массив давал проигрыш в производительности.
for (i = 1; i <= nx — 1; i++) {
//gauss //для единственного i
// boundary conditions //для единственного i

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

— порядок циклов вроде правильно ложится в кеш.
— я попробовал дополнительно делить массив еще на 4 части, имеем небольшую потерю производительности.
Понял вашу мысль. Думаю, ничего хорошего не выйдет. Слишком большие накладные расходы на 2х.
это невозможно. Нельзя выделить какой-то кусок и считать его больше одного шага. Каждая точка на следующем шаге зависит от четырех соседних.
Можно только попытаться разбить циклы внутри одного шага.
Еще моменты по оптимизации под 4 ядра. Я думал поделить массив пополам изначально, чтоб два потока обращались к разным учаскам памяти.
Мне было бы интересно, поможет ли коду Интеловский компилятор, но у меня его нет :)
Не вижу возможности вынести из циклов. Все зависит от [i][j]
-march=native проверю.
Извините, я компилирую на одной, а проверяю на разных.
Использовался вроде ‘nehalem’, проверял что от ‘sandybridge’ пользы нет (проверю, по моему у меня опции не так называются)
В интринсиках разбираться не планирую
Да, код делался только под i7. Скорее всего, для Атлона нужно смотреть отдельно.
А сколько примерно времени компилится на 8 ядрах?
Интересно. 40 ядер старенького Westmere на 2,1 ГГц в 4,4 раза быстрее, чем 6 новых ядер на 3,4.
Это даже лучше, чем прирост мегагерцев (4,1раз)
Значит задача отлично паралелится и не оптимизирована под новые инструкции.
Хотелось бы уточнить у автора, на чем именно запускались 1 6 16 потоков (процессоры 8+12потоков)
a^5+b^5 = (a+b)(a^4-a^3b+a^2b^2-ab^3+b^4)
Вдруг это поможет для нового метода :)
А нельзя было попытаться хардкорно оптимизировать №8?
Я детально не в курсе, но вроде 8 Джава поддерживается только в Андроиде 7.0. А лямбды реализованы через анонимные классы.
Там внутренний цикл 64 бита. Производительность 770 в 64-битных вычислениях около 145 ГФлопс.
У Core i5-4440 99 ГФлопс с AVX. Так что чудес от видеокарты не ждите.
Хорошая статья. Можно ли сказать, что для производительности лучше избегать вызова методов через рефлексию, если в этом нет необходимости?
На 580 fp64-блоки официально отключены (производительность в 8 раз ниже fp32)
Для тех, кто практически не в теме, была бы интересна привязка к годам.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность