Russian Qt Forum
Ноябрь 23, 2024, 03:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] ALGLIB и многопоточность  (Прочитано 7115 раз)
Vamireh
Гость
« : Февраль 25, 2014, 19:34 »

Решил избавиться от своего класса решения СЛАУ и использовать ALGLIB. СЛАУ у меня решается тысячами, поэтому многопоточно (через concurrent). В итоге получаю, что первая система решается нормально, а все остальные - там фиг знает что. Если решать в один поток в цикле, то все нормально. Кто-нибудь сталкивался с чем-то подобным?
« Последнее редактирование: Март 01, 2014, 09:58 от Vamireh » Записан
Vamireh
Гость
« Ответ #1 : Февраль 25, 2014, 19:34 »

Да, еще. Если запускать с дебаггером, то все хорошо.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Февраль 25, 2014, 19:37 »

Решил избавиться от своего класса решения СЛАУ и использовать ALGLIB. СЛАУ у меня решается тысячами, поэтому многопоточно (через concurrent). В итоге получаю, что первая система решается нормально, а все остальные - там фиг знает что. Если решать в один поток в цикле, то все нормально. Кто-нибудь сталкивался с чем-то подобным?
Так а где код? Улыбающийся
Записан
Vamireh
Гость
« Ответ #3 : Февраль 25, 2014, 19:39 »

Код:
 Kramer3d kramer;
    auto end = params.data->constEnd();

    real_2d_array a; a.setlength(3, 3);
    real_1d_array b; b.setlength(3);

    kramer.a[0][0] = Size;
    a(0,0) = Size;
    for (auto it = params.data->constBegin(); it != end; ++it) {
        const double tdTau = it->t / params.tau;
        kramer.b[0] += it->NR[params.axe];
        kramer.b[1] += it->t * it->NR[params.axe];
        kramer.b[2] += qExp(-tdTau) * it->NR[params.axe];
        kramer.a[0][1] += it->t;
        kramer.a[0][2] += qExp(-tdTau);
        kramer.a[1][1] += qPow(it->t, 2.0);
        kramer.a[1][2] += qExp(-tdTau) * it->t;
        kramer.a[2][2] += qExp(-2.0 * tdTau);

        b(0) += it->NR[params.axe];
        b(1) += it->t * it->NR[params.axe];
        b(2) += qExp(-tdTau) * it->NR[params.axe];
        a(0, 1) += it->t;
        a(0, 2) += qExp(-tdTau);
        a(1, 1) += qPow(it->t, 2.0);
        a(1, 2) += qExp(-tdTau) * it->t;
        a(2, 2) += qExp(-2.0 * tdTau);
    }
    kramer.a[1][0] = kramer.a[0][1];
    kramer.a[2][0] = kramer.a[0][2];
    kramer.a[2][1] = kramer.a[1][2];

    a(1, 0) = a(0, 1);
    a(2, 0) = a(0, 2);
    a(2, 1) = a(1, 2);

    const Array3D slu = kramer.calcSLU();
    result.koefs = {slu[2], slu[1], slu[0], static_cast<double>(params.tau)};
    real_1d_array root;
    ae_int_t info;
    densesolverreport rep;
    rmatrixsolve(a, 3, b, info, rep, root);

    if (params.axe == 0 && params.tau < 100)
    qDebug() << root(0) << root(1) << root(2) << "\t-\t" << slu[0] << slu[1] << slu[2];

kramer - это мое.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Февраль 25, 2014, 19:45 »

Как запускается многопоточный расчет?
Записан
Vamireh
Гость
« Ответ #5 : Февраль 25, 2014, 19:47 »

Как запускается многопоточный расчет?

Код:
Vector<OneAxeParams> paramsOneAxe;
        int tau = Devices.at(params.deviceTypeIndex).tauMin;
        while (tau <= Devices.at(params.deviceTypeIndex).tauMax)
            paramsOneAxe.append( {&internalData.calcedData, axe, tau++} );

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
        internalData.resultsForAllTau[axe] = QtConcurrent::blockingMapped(paramsOneAxe, &RealizInfo::calcOneAxe);
#pragma GCC diagnostic pop
« Последнее редактирование: Февраль 25, 2014, 19:50 от Vamireh » Записан
Vamireh
Гость
« Ответ #6 : Февраль 25, 2014, 19:49 »

еще заметил, что в ALGLIB в a элементы матрицы текущей итерации иногда равны сумме с предыдущего шага и с текущего шага, а иногда они сбрасываются и снова потом прибавляются. Имеются ввиду правильные значения, из моего класса.
« Последнее редактирование: Февраль 25, 2014, 19:52 от Vamireh » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Февраль 25, 2014, 19:59 »

Можно еще посмотреть что из себя представляет internalData, OneAxeParams и RealizInfo::calcOneAxe

И что за warning вы отключили? А то не понятно, что где затеняет?
« Последнее редактирование: Февраль 25, 2014, 20:15 от Old » Записан
Fat-Zer
Гость
« Ответ #8 : Февраль 25, 2014, 21:54 »

http://www.alglib.net/
как я понял, gpl'ная версия однопоточная... угадал?
« Последнее редактирование: Февраль 25, 2014, 21:59 от Fat-Zer » Записан
Vamireh
Гость
« Ответ #9 : Февраль 25, 2014, 22:12 »

В метро ехал, меня осенило. Я - то в конструкторе Kramer'а обнуляю поля, а ALGLIB - нет, завтра проверю. Но сейчас дома примитивнейший пример аналогичный написал - все работает.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Февраль 25, 2014, 22:32 »

В метро ехал, меня осенило. Я - то в конструкторе Kramer'а обнуляю поля, а ALGLIB - нет, завтра проверю. Но сейчас дома примитивнейший пример аналогичный написал - все работает.
Когда в debug работает, а в release нет - не инициализированные данные причина номер один. Улыбающийся
Записан
Vamireh
Гость
« Ответ #11 : Февраль 25, 2014, 22:35 »

Это да, просто я в своих классах всегда инициирую поля, а тут по привычке не подумал сразу об этом.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.