Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
#1

Многопоточность при сортировке массивов - C++

13.04.2014, 22:11. Просмотров 2751. Ответов 84
Метки нет (Все метки)

Уважаемые, столкнулся с ситуацией, имею 3 массива, содержимое которых одинаково (координаты точек в 3д пространстве), произвожу сортировку каждого массива по определенному измерению (x, y, z), хотел спросить, можно ли как-то ускорить процесс, возникла идея многопоточности (т.е. одновременно выполнять сортировку 3-х массивов), но я не уверен что я корректно мыслю т.к. не разу не сталкивался с многопоточностью, подскажите как правильно ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 22:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Многопоточность при сортировке массивов (C++):

Не могу найти ошибку при сортировке массивов
Даны два числа n и m и два упорядоченных по неубыванию массива A<=A<=....<=A и...

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

Задача по сортировке массивов
Используя метод сортировки выбором, переставить элементы так, чтобы непарные...

Обработка массивов и многопоточность
Здравствуйте. Одна из функций обрабатывает массивы и постоянно изменяет...

Ошибка при сортировке
При сортировке массива вылетает причем именно на последнем числе сортирую...

Ошибка при сортировке Шелла
Сортирую массив, вношу в него 46 элементов случайных значений в диапазоне от 1...

84
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:08 #61
Цитата Сообщение от NEvOl Посмотреть сообщение
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().
У вас что там, рекурсия?
0
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 13:10  [ТС] #62
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что там, рекурсия?
да, рекурсия.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2014, 13:13 #63
Цитата Сообщение от newbie666 Посмотреть сообщение
да конечно лучше делать в трёх потоках, для такой примитивной цели можешь не гемороиться с ручным созданием потоков, советую использовать Intel TBB и его parallel_for и на будущее, поставь себе Intel Parallel Studio - много чего узнаешь вдобавок .
Как раз лучше не гемориться с parallel_for, Intel TBB и тому подобным. Ладно ещё стояла бы задача автоматически выбрать количество потоков в вычислении среднего массива, тогда да. А так проще всего по числу массивов запустить "вручную" нужное количество потоков и не мучаться.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:18 #64
Что касается:
Цитата Сообщение от NEvOl Посмотреть сообщение
метода класса ? что бы указать для потоку ее в качестве функции потока.
я объяснил, а с остальным (рекурсия и прочие конструкции) сами разбирайтесь.

Добавлено через 3 минуты
C++
1
2
3
4
void operator() (nodeKdTree node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
{
        node.CreateTree(p, newP, num, iStart, rootIndex, iBranch);
}
Первый параметр не указатель, а передать пытаетесь указатель (left):
C++
1
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
Откуда и:
Цитата Сообщение от NEvOl Посмотреть сообщение
вот что говорит:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (nodeKdTree (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 246
0
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 13:21  [ТС] #65
в любом случае пока ругается на первый параметр "а".
C++
1
2
    1   IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
            argument types are: (functor (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int)  c:\filtering1\Filtering\kdTree.h    247
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:30 #66
Цитата Сообщение от NEvOl Посмотреть сообщение
в любом случае пока ругается на первый параметр "а".
В любом случае, тип параметров operator() не соответствует типам параметров, которые передаёте. Или не видите?
Цитата Сообщение от alsav22 Посмотреть сообщение
this->left,
Цитата Сообщение от alsav22 Посмотреть сообщение
nodeKdTree node
0
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 13:38  [ТС] #67
переделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class functor
{
    functor()
    {
 
    }
    ~functor()
    {
 
    }
    void operator() (nodeKdTree *node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch)
    {
        node->CreateTree(p, newP, num, iStart, rootIndex, iBranch);
    }
};
и осуществляю вызов:
C++
1
2
functor a();
std::thread th1(a, this->left, lz, newP, lnum, iStart, newIndex, -1);
не понимаю почему тогда так не совпадают параметры, this->left возвращает ведь указатель на nodeKdTree ?
error:
1 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (functor (), nodeKdTree *, photon *, nodePhoton *, int, int, int, int) c:\filtering1\Filtering\kdTree.h 243
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:03 #68
Цитата Сообщение от NEvOl Посмотреть сообщение
functor a();
C++
1
functor a;
И другие параметры, на соответствие типов, проверьте.
0
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 16:31  [ТС] #69
добился что бы работало так:
C++
1
2
functor a;
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
теперь нужно только это все в поток закинуть, в качестве поточной функции мы указывает объект класс ?

Добавлено через 14 минут
класс теперь такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class functor
{
public:
    functor()
    {
 
    }
    ~functor()
    {
 
    }
    void operator() (nodeKdTree *node, photon *p, nodePhoton *newP, int num, int iStart, int rootIndex, int iBranch, bool thr)
    {
        node->CreateTree(p, newP, num, iStart, rootIndex, iBranch, thr);
    }
};
Добавлено через 18 минут
я просто не знаю как правильно передать функтор потоку, пытался сделать так:
C++
1
2
functor a;
std::thread th1(a, this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
говорит: 36 IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
argument types are: (functor, nodeKdTree *, photon *, nodePhoton *, int, int, int, int, bool) c:\thread\ConsoleApplication1\kdTree.h 155
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 21:25 #70
Вот это что?
Цитата Сообщение от NEvOl Посмотреть сообщение
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
Цитата Сообщение от NEvOl Посмотреть сообщение
я просто не знаю как правильно передать функтор потоку, пытался сделать так:
C++
1
std::thread th1(a, this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
Внешне всё правильно. Вот это сделали?
Цитата Сообщение от alsav22 Посмотреть сообщение
И другие параметры, на соответствие типов, проверьте.
Имеется ввиду, кроме первых двух, типы которых я вижу.

Добавлено через 7 минут
Вот код, по аналогии с вашим, который компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <windows.h>
#include <thread>
using namespace std;
 
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show()
    {
        cout << a << endl;
    }
    
    void operator()(A* p, int a, int b)
    {
        for (int i = a; i < b; ++i)
        {
           show();
        }
    }
    
    void f()
    {
        A obj;
 
        thread thr1(obj, this ->pA, 1, 5);
    }
};
 
int main()
{
 
    return 0;
}
1
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 23:15  [ТС] #71
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это что?
Сообщение от NEvOl
a(this->left, lx, newP, lnum, iStart, newIndex, -1, thr);
это я показываю что без потоков работает) т.е. получается что типы соответствуют, а вот если кидаю в поток то ругается, ваш код работает) пытаюсь разобраться в чем у меня проблема, спасибо большое за помощь.

Добавлено через 1 час 0 минут
возможно что есть ограничения на число аргументов ?
потому что такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show(int a, int b, int c, int d)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d);
    }
    
    void operator()(A* p, int a, int b, int c, int d)
    {
           p->show(a, b, c, d);
    }
    
};
работает
а такой ошибку вызывает такую же как и у меня:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
    
    void show(int a, int b, int c, int d, int e)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d, e);
    }
    
    void operator()(A* p, int a, int b, int c, int d, int e)
    {
           p->show(a, b, c, d, e);
    }
    
};
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:16 #72
Цитата Сообщение от NEvOl Посмотреть сообщение
возможно что есть ограничения на число аргументов ?
Всё компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <thread>
using namespace std;
 
 
class A
{
    int a;
    A* pA;
 
public:
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show()
    {
        cout << a << endl;
    }
 
    void operator()(A* p, int a, int b, int c, int d, int f, int g, int w, int q)
    {
        p ->f(a, b, c, d, f, g, w, q);
    }
 
    void f(int a, int b, int c, int d, int f, int g, int w, int q)
    {
        A obj;
 
        thread thr1(obj, this ->pA, a, b, c, d, f, g, w, q);
    }
};
 
 
int main()
{
    A a;
    a.f(1, 2, 3, 4, 5, 6, 7, 8);
 
    return 0;
}
Добавлено через 8 минут
И этот код (ваш, из 71 поста) компилируется (у меня) без ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <thread>
using namespace std;
 
class A
{
    int a;
    A* pA;
public:
 
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show(int a, int b, int c, int d, int e)
    {
        cout << a << endl;
 
         A obj;
 
        thread thr1(obj, this->pA, a, b, c, d, e);
    }
 
    void operator()(A* p, int a, int b, int c, int d, int e)
    {
           p->show(a, b, c, d, e);
    }
 
};
 
 
int main()
{
    A a;
    a.show(1, 2, 3, 4, 5);
 
    return 0;
}
Добавлено через 1 час 5 минут
Так можно метод класса передать в поток:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <thread>
using namespace std;
 
class A
{
    int a;
 
public:
    A* pA;
    A() : a(0), pA(NULL) {}
    A(int n) : a(n) {}
 
    void show(A* pA, int a, int b, int c, int d, int e)
    {
         thread thr1(&A::show, pA, pA, a, b, c, d, e); // второй параметр - указатель на объект класса, дальше - параметры метода
 
    }
};
 
 
int main()
{
    A a;
    a.show(a.pA, 1, 2, 3, 4, 5);
 
    return 0;
}
Добавлено через 2 минуты
Энтони Уильямс "Параллельное программирование на С++ в действии. 2012."
1
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
20.04.2014, 01:21 #73
NEvOl, alsav22, я объясню в чем проблема. Дело в том, что фича Variadic templates, которая используется в std::thread для реализации этой возможности, не поддерживается VS2010, собственно в VS2012 ее тоже нет. В этом можно убедиться, например, здесь. Поэтому std::thread там реализован "по-старинке", добавлением нескольких перегрузок с разным количеством параметров. Естественно при таком подходе присутствует ограничение на максимальное количество аргументов.
Так что, либо нужно использовать один из компиляторов mingw (4.8 и выше) или clang (3.3 и выше), в которых есть полная поддержка стандарта С++11, либо поставить VS2013, в которой есть поддержка variadic templates.
2
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:30 #74
Я начал подозревать, что дело может в разных, с ТС, компиляторах, поэтому, в последнем посте, подчеркнул, что, именно у меня, компилируется (mingw 4.8.1).
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
20.04.2014, 01:32 #75
alsav22, ну да. Совет использовать наиболее новые версии компиляторов относился к ТС. Это разумно, если хочется работать с новым стандартом с наименьшими проблемами.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:08 #76
NEvOl, в 13-ой студии компилируется.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
20.04.2014, 02:40 #77
Можно также использовать std::bind для формирования функтора.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:54 #78
DrOffset, не поймите превратно, но я просто проверил. Что меня смутило, в вашем сообщении, так вот это:
Цитата Сообщение от DrOffset Посмотреть сообщение
Дело в том, что фича Variadic templates, которая используется в std::thread для реализации этой возможности, не поддерживается VS2010, собственно в VS2012 ее тоже нет. ... Поэтому std::thread там реализован "по-старинке", добавлением нескольких перегрузок с разным количеством параметров.
Из этого можно предположить, что std::thread поддерживается в 10-й студии. Но разве это так?
0
NEvOl
19 / 18 / 1
Регистрация: 13.08.2012
Сообщений: 734
20.04.2014, 09:30  [ТС] #79
alsav22, а можно эту задачу реализовать через std::async ?
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 09:36 #80
Цитата Сообщение от NEvOl Посмотреть сообщение
эту задачу
Эту - какую?
0
20.04.2014, 09:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 09:36
Привет! Вот еще темы с решениями:

Ошибка при сортировке пузырьком
Видимо выход за предел массива, не пойму где ошибка #include &lt;iostream&gt;...

Использование массива индексов при сортировке
Задали задачку отсортировать обычный одномерный массив. Так же, нужно...

Анимация интерфейса при сортировке массива
Доброго времени суток! Подскажите, с помощью чего удобнее всего реализовать...

Не совсем корректный вывод при сортировке
В скриншоте видно что у меня с файла выводит имя цветка, цвет, количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru