Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Zialot от Декабрь 09, 2017, 05:37



Название: Параллельное заполнение одномерного массива
Отправлено: Zialot от Декабрь 09, 2017, 05:37
  Доброго времени суток. Начинаю изучение параллельного программирования. Хотелось бы узнать как, к примеру, можно распараллелить заполнение одномерного массива, допустим случайными числами. При помощи QThread или QtConcurrent. Буду рад любому примеру.


Название: Re: Параллельное заполнение одномерного массива
Отправлено: Kurles от Декабрь 10, 2017, 03:37
  Доброго времени суток. Начинаю изучение параллельного программирования. Хотелось бы узнать как, к примеру, можно распараллелить заполнение одномерного массива, допустим случайными числами. При помощи QThread или QtConcurrent. Буду рад любому примеру.
Для поставленной задачи всё просто - делишь массив на кол-во блоков, равному количеству потоков, и в каждом потоке независимо заполняешь нужный блок. Примерно так:

Код
C++ (Qt)
#include <QCoreApplication>
 
#include <QDebug>
#include <QVector>
#include <QtConcurrent>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QVector<int> vector;
   // Для примера массив 10 миллионов значений
   vector.resize(10000000);
   QList<QFuture<void>> results;
   for (int i = 0; i < 10; ++i) {
       // Получаем указатель на нужный блок
       int *data = vector.data() + i * 1000000;
       // запускаем в отдельных потоках заполнялку, указываем лямбде адрес начала блока и его длинну
       auto result = QtConcurrent::run([i](int *data, const size_t size) {
           for (int i = 0; i < size; ++i) {
               *(data++) = qrand();
           }
           // для отладки выводим на экран номер заполненного блока
           qDebug() << i;
       }, data, 1000000);
       // нужно для ожидания окончания заполнения массива
       results.append(result);
   }
 
   // ждем завершение заполнения массива
   for (auto &f : results) {
       f.waitForFinished();
   }
 
   qDebug() << "end";
 
   return 0;
}
 
 


Название: Re: Параллельное заполнение одномерного массива
Отправлено: Igors от Декабрь 10, 2017, 12:12
Хотелось бы узнать как, к примеру, можно распараллелить заполнение одномерного массива, допустим случайными числами. При помощи QThread или QtConcurrent.
Понятно что это "к примеру", но, возможно, самое важное в multi-threading - удачно выбрать (поставить) задачу. Напр в данном случае разбиение массива на части имеет отрицательный эффект (т.е. скорость ниже). Хотя это типовой прием.

Неплохо начать напр с атомарного лока, он нужен частенько. Ну типа сделать "потокобезопасный" контейнер


Название: Re: Параллельное заполнение одномерного массива
Отправлено: Old от Декабрь 10, 2017, 18:59
Напр в данном случае разбиение массива на части имеет отрицательный эффект (т.е. скорость ниже). Хотя это типовой прием.
Сможете это подтвердить кодом?