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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Параллельное заполнение одномерного массива  (Прочитано 3623 раз)
Zialot
Гость
« : Декабрь 09, 2017, 05:37 »

  Доброго времени суток. Начинаю изучение параллельного программирования. Хотелось бы узнать как, к примеру, можно распараллелить заполнение одномерного массива, допустим случайными числами. При помощи QThread или QtConcurrent. Буду рад любому примеру.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Декабрь 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;
}
 
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 10, 2017, 12:12 »

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Декабрь 10, 2017, 18:59 »

Напр в данном случае разбиение массива на части имеет отрицательный эффект (т.е. скорость ниже). Хотя это типовой прием.
Сможете это подтвердить кодом?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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