20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
1

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

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

Author24 — интернет-сервис помощи студентам
Уважаемые, столкнулся с ситуацией, имею 3 массива, содержимое которых одинаково (координаты точек в 3д пространстве), произвожу сортировку каждого массива по определенному измерению (x, y, z), хотел спросить, можно ли как-то ускорить процесс, возникла идея многопоточности (т.е. одновременно выполнять сортировку 3-х массивов), но я не уверен что я корректно мыслю т.к. не разу не сталкивался с многопоточностью, подскажите как правильно ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2014, 22:11
Ответы с готовыми решениями:

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

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

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

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

84
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:08 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от NEvOl Посмотреть сообщение
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().
У вас что там, рекурсия?
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
19.04.2014, 13:10  [ТС] 62
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что там, рекурсия?
да, рекурсия.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2014, 13:13 63
Цитата Сообщение от newbie666 Посмотреть сообщение
да конечно лучше делать в трёх потоках, для такой примитивной цели можешь не гемороиться с ручным созданием потоков, советую использовать Intel TBB и его parallel_for и на будущее, поставь себе Intel Parallel Studio - много чего узнаешь вдобавок .
Как раз лучше не гемориться с parallel_for, Intel TBB и тому подобным. Ладно ещё стояла бы задача автоматически выбрать количество потоков в вычислении среднего массива, тогда да. А так проще всего по числу массивов запустить "вручную" нужное количество потоков и не мучаться.
0
5498 / 4893 / 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
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:30 66
Цитата Сообщение от NEvOl Посмотреть сообщение
в любом случае пока ругается на первый параметр "а".
В любом случае, тип параметров operator() не соответствует типам параметров, которые передаёте. Или не видите?
Цитата Сообщение от alsav22 Посмотреть сообщение
this->left,
Цитата Сообщение от alsav22 Посмотреть сообщение
nodeKdTree node
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:03 68
Цитата Сообщение от NEvOl Посмотреть сообщение
functor a();
C++
1
functor a;
И другие параметры, на соответствие типов, проверьте.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
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
5498 / 4893 / 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
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
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
5498 / 4893 / 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
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:30 74
Я начал подозревать, что дело может в разных, с ТС, компиляторах, поэтому, в последнем посте, подчеркнул, что, именно у меня, компилируется (mingw 4.8.1).
0
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
20.04.2014, 01:32 75
alsav22, ну да. Совет использовать наиболее новые версии компиляторов относился к ТС. Это разумно, если хочется работать с новым стандартом с наименьшими проблемами.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 02:08 76
NEvOl, в 13-ой студии компилируется.
0
18828 / 9831 / 2403
Регистрация: 30.01.2014
Сообщений: 17,267
20.04.2014, 02:40 77
Можно также использовать std::bind для формирования функтора.
0
5498 / 4893 / 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
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
20.04.2014, 09:30  [ТС] 79
alsav22, а можно эту задачу реализовать через std::async ?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 09:36 80
Цитата Сообщение от NEvOl Посмотреть сообщение
эту задачу
Эту - какую?
0
20.04.2014, 09:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2014, 09:36
Помогаю со студенческими работами здесь

Многопоточность: вывести на экран символ, который встречается наибольшее количество раз в каждом из массивов
У меня есть такая задачка: Есть 3 массивы 1 содержит 2 миллиона символов 2 содержит 1000000...

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru