Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
13.04.2014, 22:11     Многопоточность при сортировке массивов #1
Уважаемые, столкнулся с ситуацией, имею 3 массива, содержимое которых одинаково (координаты точек в 3д пространстве), произвожу сортировку каждого массива по определенному измерению (x, y, z), хотел спросить, можно ли как-то ускорить процесс, возникла идея многопоточности (т.е. одновременно выполнять сортировку 3-х массивов), но я не уверен что я корректно мыслю т.к. не разу не сталкивался с многопоточностью, подскажите как правильно ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:08     Многопоточность при сортировке массивов #61
Цитата Сообщение от NEvOl Посмотреть сообщение
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().
У вас что там, рекурсия?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
19.04.2014, 13:10  [ТС]     Многопоточность при сортировке массивов #62
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что там, рекурсия?
да, рекурсия.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2014, 13:13     Многопоточность при сортировке массивов #63
Цитата Сообщение от newbie666 Посмотреть сообщение
да конечно лучше делать в трёх потоках, для такой примитивной цели можешь не гемороиться с ручным созданием потоков, советую использовать Intel TBB и его parallel_for и на будущее, поставь себе Intel Parallel Studio - много чего узнаешь вдобавок .
Как раз лучше не гемориться с parallel_for, Intel TBB и тому подобным. Ладно ещё стояла бы задача автоматически выбрать количество потоков в вычислении среднего массива, тогда да. А так проще всего по числу массивов запустить "вручную" нужное количество потоков и не мучаться.
alsav22
5282 / 4801 / 442
Регистрация: 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
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
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
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:30     Многопоточность при сортировке массивов #66
Цитата Сообщение от NEvOl Посмотреть сообщение
в любом случае пока ругается на первый параметр "а".
В любом случае, тип параметров operator() не соответствует типам параметров, которые передаёте. Или не видите?
Цитата Сообщение от alsav22 Посмотреть сообщение
this->left,
Цитата Сообщение от alsav22 Посмотреть сообщение
nodeKdTree node
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
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
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:03     Многопоточность при сортировке массивов #68
Цитата Сообщение от NEvOl Посмотреть сообщение
functor a();
C++
1
functor a;
И другие параметры, на соответствие типов, проверьте.
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
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
alsav22
5282 / 4801 / 442
Регистрация: 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;
}
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
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);
    }
    
};
alsav22
5282 / 4801 / 442
Регистрация: 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."
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:30     Многопоточность при сортировке массивов #74
Я начал подозревать, что дело может в разных, с ТС, компиляторах, поэтому, в последнем посте, подчеркнул, что, именно у меня, компилируется (mingw 4.8.1).
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
20.04.2014, 01:32     Многопоточность при сортировке массивов #75
alsav22, ну да. Совет использовать наиболее новые версии компиляторов относился к ТС. Это разумно, если хочется работать с новым стандартом с наименьшими проблемами.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:08     Многопоточность при сортировке массивов #76
NEvOl, в 13-ой студии компилируется.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
20.04.2014, 02:40     Многопоточность при сортировке массивов #77
Можно также использовать std::bind для формирования функтора.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:54     Многопоточность при сортировке массивов #78
DrOffset, не поймите превратно, но я просто проверил. Что меня смутило, в вашем сообщении, так вот это:
Цитата Сообщение от DrOffset Посмотреть сообщение
Дело в том, что фича Variadic templates, которая используется в std::thread для реализации этой возможности, не поддерживается VS2010, собственно в VS2012 ее тоже нет. ... Поэтому std::thread там реализован "по-старинке", добавлением нескольких перегрузок с разным количеством параметров.
Из этого можно предположить, что std::thread поддерживается в 10-й студии. Но разве это так?
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
20.04.2014, 09:30  [ТС]     Многопоточность при сортировке массивов #79
alsav22, а можно эту задачу реализовать через std::async ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 09:36     Многопоточность при сортировке массивов
Еще ссылки по теме:

C++ Ошибка при сортировке Шелла
Ошибка при сортировке пузырьком C++
C++ Почему программа падает при сортировке массивов больших размерностей

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 09:36     Многопоточность при сортировке массивов #80
Цитата Сообщение от NEvOl Посмотреть сообщение
эту задачу
Эту - какую?
Yandex
Объявления
20.04.2014, 09:36     Многопоточность при сортировке массивов
Ответ Создать тему
Опции темы

Текущее время: 12:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru