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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Параллельное выполнение цикла расчета  (Прочитано 13262 раз)
Daniel
Гость
« Ответ #15 : Ноябрь 22, 2012, 19:59 »

А после отправки сигнала и исполнения слота, возобновить тред thread->start()? И она продолжит с того же места или начнет run() сначала?
Записан
ssoft
Гость
« Ответ #16 : Ноябрь 23, 2012, 07:08 »

Скорость выполнения одна и та же, но [] намного легче для восприятия. Использование ** (двух звездочек в объявлении) нежелательно, трех - тем более.  

Написал грубый тест производительности.

Код:
		QVector< float > data( 1024, 0.0f );
float * values = data.data();
int int_count = data.count();

for ( int i = 0; i < 40; ++i )
{

quint64 count = quint64( 1 ) << i;
qDebug()
<< "Start tests:" << i
<< "-" << count << "iterations";

QTime timing;
timing.start();

for ( quint64 iter = 0; iter < count; ++iter )
{
for ( int i = 0; i < int_count; ++i )
{
values[ i ] = static_cast< float >( iter + i );
}
}
qDebug()
<< timing.elapsed()
<< "for container[ i ]";

timing.restart();

for ( quint64 iter = 0; iter < count; ++iter )
{
for ( int i = 0; i < int_count; ++i )
{
*( values + i ) = static_cast< float >( iter + i );
}
}
qDebug()
<< timing.elapsed()
<< "for *( array + i )";
}
}

return 0;

Для компилятора gcc (mingw) разницы нет, а вот для MSVC2010 разница почти в 10%!
Впервые столкнулся с этим при реализации численных методов лет 8 назад.
10% при длительности расчетов дни или недели - это очень существенно.
Поправьте, если я не прав.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #17 : Ноябрь 23, 2012, 08:38 »

Замеряли, надеюсь, в release с включёнными оптимизациями? Компиляторы сейчас достаточно умны, чтобы слажать на таком примитивном случае.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Ноябрь 23, 2012, 09:48 »

А после отправки сигнала и исполнения слота, возобновить тред thread->start()? И она продолжит с того же места или начнет run() сначала?
Продолжит (см описание BlockingQueuedConnection). Вообще распараллеливание - довольно серьезная штука, часто требуется переделать задачу в корне. Конечно получится сходу - слава богу, но рассчитывать на это не стоит. Возможно есть смысл сначала попробовать на небольшом тестовом проекте.

Для компилятора gcc (mingw) разницы нет, а вот для MSVC2010 разница почти в 10%!
Впервые столкнулся с этим при реализации численных методов лет 8 назад.
10% при длительности расчетов дни или недели - это очень существенно.
Поправьте, если я не прав.
В MSVC есть много такого что совершенно недоступно моему пониманию Улыбающийся А вообще это классический пример из библии Страутструпа где говорится типа "современный компилятор должен сделать примерно одинаковый код".

Длительность расчетов дни/недели часто свидетельствует просто о том что никаких попыток оптимизировать вычисления не предпринималось Улыбающийся У меня нет оснований не верить Вашим тестам, но это проверка "холостого хода". То есть изменив все [] на * в рабочем проекте мы получим совсем не -10%, а возможно -2%. а может даже и +5% (бывает и так). В другом кусочке кода компилятор может разбираться с [] уже совсем по-другому.
Записан
ssoft
Гость
« Ответ #19 : Ноябрь 23, 2012, 10:08 »

MSVC2010
Release
Проверил всё, что предлагает студия
  Disabled (/Od) здесь всегда все одинаково.

А вот для

  Minimize Size /01
  Maximize Speed /02
  Full Optimization /0x

получился просто "волшебный" результат.
Последовательный запуск одной и тоже программы может привести как к одинаковому результату

Код:
Start tests: 16 - 65536 iterations 
612 for container[ i ]
610 for *( array + i )
Start tests: 17 - 131072 iterations
1235 for container[ i ]
1230 for *( array + i )
Start tests: 18 - 262144 iterations
2473 for container[ i ]
2452 for *( array + i )
Start tests: 19 - 524288 iterations
4920 for container[ i ]
4903 for *( array + i )
Start tests: 20 - 1048576 iterations
9810 for container[ i ]
9820 for *( array + i )

так и к разному

Код:
Start tests: 16 - 65536 iterations 
613 for container[ i ]
690 for *( array + i )
Start tests: 17 - 131072 iterations
1232 for container[ i ]
1390 for *( array + i )
Start tests: 18 - 262144 iterations
2455 for container[ i ]
2775 for *( array + i )
Start tests: 19 - 524288 iterations
4908 for container[ i ]
5612 for *( array + i )
Start tests: 20 - 1048576 iterations
9818 for container[ i ]
11183 for *( array + i )

не удивлюсь, если у кого-нибудь будет наоборот.

Склоняюсь к мнению, что предложенный мной тест не корректен, и разницы между записями нет.
Вообще нужно сравнить ассемблерный код, он должен быть идентичен.
В gcc все стабильно - результат одинаковый.

Цитировать
Длительность расчетов дни/недели часто свидетельствует просто о том что никаких попыток оптимизировать вычисления не предпринималось

часто да, но здесь нет  Смеющийся. Ряд задач, например, нестационарные задачи газовой динамики с подвижной геометрией считают неделями, а иногда и месяцами.
« Последнее редактирование: Ноябрь 23, 2012, 10:16 от ssoft » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Ноябрь 23, 2012, 10:33 »

Склоняюсь к мнению, что предложенный мной тест не корректен, и разницы между записями нет.
Вообще нужно сравнить ассемблерный код, он должен быть идентичен.
В gcc все стабильно - результат одинаковый.
Я бы подытожил так: ковыряться в этом нет никакого смысла, здесь ничего не извлечь  Улыбающийся

часто да, но здесь нет  Смеющийся. Ряд задач, например, нестационарные задачи газовой динамики с подвижной геометрией считают неделями, а иногда и месяцами.
Ну спорить о незнакомой мне предметной области я не могу, поэтому др пример. Вы давеча спрашивали "что ето за рендер" - там тоже если увеличить разрешение, то счет быстро пойдет на часы и дни. Однако никаким "волшебным кодом" (т.е. чисто технически) это не решить - нужно менять/усиливать алгоритм.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #21 : Ноябрь 23, 2012, 11:26 »

 может немного не в тему, но если такие вычисления длятся сутками, то может посмотреть в сторону OpenCL? и перенсти нагрузку на видеокарту?
Записан
ssoft
Гость
« Ответ #22 : Ноябрь 23, 2012, 14:20 »

может немного не в тему, но если такие вычисления длятся сутками, то может посмотреть в сторону OpenCL? и перенсти нагрузку на видеокарту?

Так и делают уже достаточно давно (несколько лет), но пока на уровне научно-исследовательских работ.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #23 : Ноябрь 23, 2012, 14:35 »

Так и делают уже достаточно давно (несколько лет), но пока на уровне научно-исследовательских работ.
Очень плотно уже несколько лет работаем с вычислениями на видеокартах NVidia, но не через OpenCL, а через CUDA Toolkit. Очень нравится. И инструментарий разработчика, и комъюнити, и результаты. Раньше эти же задачи решали на ПЛИС - сроки вывода решений на рынок стали в разы короче.
Записан
Daniel
Гость
« Ответ #24 : Ноябрь 23, 2012, 17:42 »

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


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