А чем SWING выглядит не прилично?

Работал с ним, писал icq-клиент… Достаточно простая в использовании библиотека
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Полученные выше результаты - фикция, из-за структурных ошибок… Буду разбираться со всем этим дальше. Одно скажу, что решение ОДУ сложно распараллелить…

Изучение специальной литературы по численным методам дало следующий, достаточно прозрачный параллельный алгоритм интегрирования ОДУ. Пусть есть система N обыкновенных дифференциальных уравнений (ОДУ) вида

y = f(t, y), с начальным условием y(t0) = y0

(полужирным показаны векторы), т.е. задача Коши для системы ОДУ, которую надо решить на интервале времени t0 <= t <= tk.

Весь временной интервал разбиваем на участки длинной h - шаг интегрирования. Распределяем уравнения между ядрами, в случае одинаковой загрузки ядер (одинаковое число уравнений каждому), каждое ядро выполняет операцию (для простоты одинаково, в реальности одно/несколько ядер оказывается недо- или перегруженнымб что тоже приводит к рассинхронизации с гарантией в 100%)

yj = yj + h*fj(y0, y1, ….,yN), где j = nc*p…(nc + 1)*p, причем nc - номер ядра, p - число уравнений на одно ядро.

После того как все ядра закончат считать свои итерации необходимо нарастить время t = t + h и перейти к следующей итерации.

Так вот гвоздь как раз в синхронизации, время нужно наращивать после выполнения итерации всеми ядрами, и только в этот момент. В приведенном выше примере наращивание времени тоже распараллелено, отсюда и “прирост” производительности.

Вобщем решаю вопросы синхронизации… Как решу, продолжу…

P.S.: решал это не только с OpenMP, но и “от сохи”, заюзав POSIX-треды… Всё упирается в синхронизацию…
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
cucullus
Кстати, Вам на elibrary быстро SPIN присвоили? А то я уже 3 недели жду, а обещали за одну…

Честно говоря, я не помню. Зарегистрировался я в 2010 году а пользоваться начал в 2011, был период когда было не до науки… Вобщем я зарегистрировался и забросил elibrary надолго. Потом обнаружил там кучу своих публикаций
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
С утра хотел написать, да провайдер меня подвел.

Так вот, попробовал я OpenMP, благо чтобы его задействовать достаточно включить #include <omp.h> и поставить компилятору ключик -fopenmp

cucullus
модификация кода – мизерная, профит – моментальный

Абсолютно согласен :) В качестве задачи для теста выбрал простенькую реализацию той задачи что решаю в своем проекте - движение поезда с учетом усилий возникающих в автосцепках. Сразу скажу, что приведенный пример это не та модель что используется в проекте, проект - здоровенное приложение с ООП и динамической загрузкой матмоделей подвижных единиц из *.so… Это предельно упрощенная постановка задача движения поезда из N подвижных единиц, с моделью сцепки в виде упругой связи, без учета сил сопротивления движению и прочего, то есть такой “сферический поезд в вакууме”

Вот код с применением OpenMP
//==============================================================================
//
//      Тестовая задача реализации параллельных вычислений OpenMP
//      (с) Притыкин Д. Е., к.т.н., доцент кафедры "Теоретическая механика"
//
//==============================================================================
#include        "openmp_train.h"
const   int     VEHICLES = 200;    
const   int     N = VEHICLES + 1;
const   double   c = 1.5e7;
double   dt = 1e-7;
double   t = 0;
double   tk = 10.0;
double  m[N]; // массы подвижных единиц (ПЕ)
double  y[2*N]; // фазовые координаты ПЕ
double  T[N+1]; // усилия в сцепках ПЕ
double  F[N]; // вектор внешних сил
double print_time = 0.0;
bool first_print = true;
timeval time0;
timeval time1;
double  calc_time = 0;
int i = 0;
int j = 0;
double dT = 0.01;
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void OdeStep(double* mass, double* Y, double* Tc, double* force, double deltaT)
{
    #pragma omp for nowait
    for (i = 0; i < N; i++)
    {
        Tc[i+1] = c*(Y[i] - Y[i+1]);
        Tc[0] = 0.0;
        Tc[N] = 0.0;
        Y[i] = Y[i] + Y[i+N]*deltaT;
        Y[i+N] = Y[i+N] + deltaT*(force[i] + Tc[i] - Tc[i+1])/mass[i];
    }    
}
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
int main(void)
{
    // Инициализация
    m[0] = 129*1000;
    F[0] = 450*1000;
        
    for (i = 1; i < N; i++)
    {
        m[i] = 58*1000;
        F[i] = 0.0;
    }
    
    for (i = 0; i < 2*N; i++)
    {
        y[i] = 0.0;
    }
    
    for (i = 0; i < N+1; i++)
    {
        T[i] = 0.0;
    }   
      
    // Инициализация OpenMP
    omp_set_dynamic(0); // Запрещаем менять число потокв при выполнении
    omp_set_num_threads(8); // Задаем 8 потоков
          
    // Засекаем время начала расчета
    gettimeofday(&time0, NULL);  
// Задаем регион кода, вычисляемый параллелльно
#pragma omp parallel shared(m, y, T, F) private(i)
{
    while (t <= tk)
    {
        // Выполняем шаг интегрирования
        OdeStep(m, y, T, F, dt);  
        
        // Выводим результат на экран
       
        if ( ( t >= dT*j) || (j == 0) )
        {
                printf("%5i| time: %8.2f, с | progress: %5.1f % | T1: %8.1f, кН\n", j, t, t*100/tk, T[1]/1000.0);
                j++;            
        }
        
        
        t += dt;
    }
}
    
    // Засекаем время окончания расчета
    gettimeofday(&time1, NULL);
    
    // Вычисляем время расчета
    calc_time = ( time1.tv_sec + time1.tv_usec/1e6 ) - ( time0.tv_sec + time0.tv_usec/1e6 );
    
    printf(" time: %8.2f, с | progress: %5.1f % | T1: %8.1f, кН\n", t, t*100/tk, T[1]/1000.0);
    printf("\nCalculation time: %f, s\n", calc_time);    
    
    return 0;
}

Сабж подключается путем включения в код директив #pragma omp parallel shared(m, y, T, F) private(i) {….} и #pragma omp for nowait, причем последняя, перед циклом, подлежащим распараллеливанию. Распараллеливанию здесь подлежит расчет усилий в сцепках вагонов, расчет ускорений вагонов, и собственно вычесление значения фазовых координат (скорости и перемещения вагонов) на текущем шаге по значениям ускорений и скоростей на предыдущем шаге. То есть это интегрирования самым простецким явным методом Эйлера. Вот функция OdeStep() в данной реализации выполняется параллельно на восьми потоках (хочется сказать ядрах) моего intel core i7.

Пришлось покорвырятся, чтобы получить приемлемый результат. Условия расчета такие: время расчета (модельное) - 10 секунд движения поезда, шаг интегрирования - 0.1 микросекунды. Считалось для разного числа вагонов как в параллельном варианте, так и без распараллеливания.

Результат - все 8 “ядер” (ну буду я их ядрами звать, проще, знаю я что там 4 ядра с гипертрейдингом…) грузятся на 100% (смотрел по Conky). Производительность расчетов иллюстрирую графиками



С ростом числа решаемых диффур прирост производительности становится всё более существенным :) Видно по синему графику, что с ростом числа диффур время расчета увеличивается крайне незначительно, то есть распараллеливание дает здесь хороший эффект.

Конечно, этот код можно ещё оптимизировать, например перейти к расчету сил в упругих связях матричным методом, а операции с матрицами как известно являются хорошо распараллеливаемыми. Ну и деления умножения минимизировать, тоже тут необъятное поля для деятельности…

Ок, буду разбираться дальше.

P.S.: Ашник не закинул, да там ничего интересного, но все же

#pragma         once
#include        <stdio.h>
#include        <math.h>
#include        <omp.h>
#include        <stdlib.h>
#include        <sys/time.h>
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Про OpenCL слышал, а вот про OpenMP и OpenMPI - впервые.

За что люблю арч - всё перечисленное легко достал из репозитория. Буду разбираться, спасибо

sirocco
через OpenCL будет задействован AVX

Есть ключики к компилятору gcc -march=corei7-avx и -mtune=corei7-avx. Не знаю правда насколько эффективны. Ну одними ключами проблемы не решатся, канеш
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Вчера собирал wine из исходников, интересно было просто, дык открыл для себя ключ к make, ключ -j8…. Ну процессор у меня Intel Core i7… Я чуть печенькой не подавился - все ядра загрузились на 100% wine минуты за три собрался.

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

На деле в моем проекте нагружается на 100% только пока одно ядро, на которое я повесил, принудительно привязав к нему поток решения системы диффур
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
sleepycat
сделай работу, посиди часа 4-5, если за это время не придет желание чтото поменять - выкладывай. Так совет по опыту, а то сейчас весь октябрь будет “твоим” )))

Ой, извиняюсь, увлекся… :)

P.S.: Респект всем за полезные советы ;)
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org


Сделал фон коньков прозрачным на 50%, убрал нафиг idesk, он конфликтовал с conky не давая ему перезапускаться при выходе из сессии иксов. Нашлепал иконок на пенель, причем вместо pypanel взял tint2-svn
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Убрал ярлыки со стола, уговорили :)

Продолжаю эксперименты, интересный конструктор
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org


Надеюсь что это окончательный вариант. Добавил распределение производительности по ядрам, прогноз погоды выполнил в более аскетичном стиле, использовав сторонний скрипт.

Попробовал с фоном, прозрачный таки лучше смотрится, может обоину сменить чтобы там темная зона была
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org