Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Марина от Апрель 29, 2014, 16:20



Название: Сортировка слиянием.
Отправлено: Марина от Апрель 29, 2014, 16:20
Есть программа на с++ сортировка методом слияния. Нужно сделать эту сортировку многопоточной. Не получается. Может кто подскажет чего?
#include "stdafx.h"
#include <iostream>
using namespace std;
//функция, сливающая массивы
void Merge(int *A, int first, int last)
{
int middle, start, final, j;
int *mas=new int[100];
middle=(first+last)/2; //вычисление среднего элемента
start=first; //начало левой части
final=middle+1; //начало правой части
for(j=first; j<=last; j++) //выполнять от начала до конца
if ((start<=middle) && ((final>last) || (A[start]<A[final])))
{
mas[j]=A[start];
start++;
}
else
{
mas[j]=A[final];
final++;
}
//возвращение результата в список
for (j=first; j<=last; j++) A[j]=mas[j];
delete[]mas;
};
//рекурсивная процедура сортировки
void MergeSort(int *A, int first, int last)
{
{
if (first<last)
{
MergeSort(A, first, (first+last)/2); //сортировка левой части
MergeSort(A, (first+last)/2+1, last); //сортировка правой части
Merge(A, first, last); //слияние двух частей
}
}
};
//главная функция
void main()
{
setlocale(LC_ALL, "Rus");
int i, n;
int *A=new int[100];
cout<<"Размер массива > "; cin>>n;
for (i=1; i<=n; i++)
{ cout<<i<<" элемент > "; cin>>A;}
MergeSort(A, 1, n); //вызов сортирующей процедуры
cout<<"Упорядоченный массив: "; //вывод упорядоченного массива
for (i=1; i<=n; i++) cout<<A<<" ";
delete []A;
system("pause>>void");
}


на Qt  работает.


Название: Re: Сортировка слиянием.
Отправлено: OKTA от Апрель 29, 2014, 16:29
Ознакомьтесь и используйте - QtConcurrentRun


Название: Re: Сортировка слиянием.
Отправлено: gil9red от Апрель 29, 2014, 23:37
Нужно сделать эту сортировку многопоточной. Не получается.
А вы и не пытались :) для многопоточности используется QThread (http://qt-project.org/doc/qt-4.8/qthread.html#details) или QtConcurrentRun (http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html) ;)

на Qt  работает.
Конечно работает, Ведь Qt - библиотека с++ :)

И для оформления кода используйте тэг code (кнопка с решеткой # или выбор в выпадающем списке языков) :)


Название: Re: Сортировка слиянием.
Отправлено: Igors от Апрель 30, 2014, 10:23
Марина, пользуйтесь тегом для оформления кода

Ознакомьтесь и используйте - QtConcurrentRun

А вы и не пытались :) для многопоточности используется QThread (http://qt-project.org/doc/qt-4.8/qthread.html#details) или QtConcurrentRun (http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html) ;)
Резво :) Но вот на что Вы будете натравливать QtConcurrentRun? Ведь вначале у Вас всего одна задача. Только после того как раскидаете массив на 2 части - 2 задачи и.т.д. А ядер напр 8. И что будете делать?  :)


Название: Re: Сортировка слиянием.
Отправлено: OKTA от Апрель 30, 2014, 10:39
Это уже дело TC.
А какая разница сколько ядер? В 32-разрядной винде к примеру нельзя создать внутри одного процесса больше 2048 потоков, сколько бы процессоров и ядер не было. А на каких ядрах эти потоки будут работать - целиком дело системы. Если конечно не пытаться это изменить самому.


Название: Re: Сортировка слиянием.
Отправлено: Igors от Апрель 30, 2014, 10:54
Это уже дело TC.
А какая разница сколько ядер? В 32-разрядной винде ...
В другую сторону смотрите - что/как распараллелить. Это в данном случае не так уж просто. Я делал через omp intel task но это решение не общее. Вопрос хороший/интересный (неважно подозревал ли об этом ТС  :))


Название: Re: Сортировка слиянием.
Отправлено: OKTA от Апрель 30, 2014, 11:03
Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  ;D


Название: Re: Сортировка слиянием.
Отправлено: Igors от Апрель 30, 2014, 11:38
Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  ;D
Думается это не тот случай когда можно снисходительно давать советы :) У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же.


Название: Re: Сортировка слиянием.
Отправлено: OKTA от Апрель 30, 2014, 14:35
Распараллелить сортировку подмассивов уже даст выигрыш в скорости. Останется вопрос в распареллеливании ф-ии слияния массивов, но в данной реализации она не особо и поддастся, а смотреть другие способы слияния - уже другой вопрос и опять же к ТС.


Название: Re: Сортировка слиянием.
Отправлено: gil9red от Апрель 30, 2014, 19:05
Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  ;D
Думается это не тот случай когда можно снисходительно давать советы :) У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же.

Не знаю, не разбирался :) спросили на Qt-шном форуме про потоки, вот я и подсказал инструмент :)


Название: Re: Сортировка слиянием.
Отправлено: Old от Май 02, 2014, 13:04
на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью.
Улыбнуло. А что, по вашему, не так с оптимальностью std::thread? Да ещё и по сравнению с QThread? :)