Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 734
#1

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

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

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

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

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

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

Ошибка при сортировке - C++
При сортировке массива вылетает причем именно на последнем числе сортирую так : for (int i=0;i<count;i++) { if (a>a) { ...

Ошибка при сортировке пузырьком - C++
Видимо выход за предел массива, не пойму где ошибка #include <iostream> #include <ctime> #include <cstdlib> using...

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

84
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:08 #61
Цитата Сообщение от NEvOl Посмотреть сообщение
это делается внутри функции nodeKdTree::CreateTree()
у объекта nodeKdTree имеется объект left (nodeKdTree) для которого нужно вызвать функцию CreateTree().
У вас что там, рекурсия?
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 734
19.04.2014, 13:10  [ТС] #62
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что там, рекурсия?
да, рекурсия.
0
taras atavin
3888 / 1762 / 92
Регистрация: 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
5435 / 4830 / 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
0
NEvOl
19 / 18 / 0
Регистрация: 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
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 13:30 #66
Цитата Сообщение от NEvOl Посмотреть сообщение
в любом случае пока ругается на первый параметр "а".
В любом случае, тип параметров operator() не соответствует типам параметров, которые передаёте. Или не видите?
Цитата Сообщение от alsav22 Посмотреть сообщение
this->left,
Цитата Сообщение от alsav22 Посмотреть сообщение
nodeKdTree node
0
NEvOl
19 / 18 / 0
Регистрация: 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
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:03 #68
Цитата Сообщение от NEvOl Посмотреть сообщение
functor a();
C++
1
functor a;
И другие параметры, на соответствие типов, проверьте.
0
NEvOl
19 / 18 / 0
Регистрация: 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
5435 / 4830 / 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;
}
1
NEvOl
19 / 18 / 0
Регистрация: 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
5435 / 4830 / 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."
1
DrOffset
7517 / 4513 / 1024
Регистрация: 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
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2014, 01:30 #74
Я начал подозревать, что дело может в разных, с ТС, компиляторах, поэтому, в последнем посте, подчеркнул, что, именно у меня, компилируется (mingw 4.8.1).
0
DrOffset
7517 / 4513 / 1024
Регистрация: 30.01.2014
Сообщений: 7,362
20.04.2014, 01:32 #75
alsav22, ну да. Совет использовать наиболее новые версии компиляторов относился к ТС. Это разумно, если хочется работать с новым стандартом с наименьшими проблемами.
0
20.04.2014, 01:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 01:32
Привет! Вот еще темы с ответами:

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

Количество перестановок при сортировке массива - C++
Как вывести число количества перестановок после сортировки массива, допустим выбору?

Не совсем корректный вывод при сортировке - C++
В скриншоте видно что у меня с файла выводит имя цветка, цвет, количество цветов(этот параметр выводит как текстовое значение, хотя в файле...

Ошибка при сортировке двумерного массива по возрастанию - C++
По убыванию сортировка работает полноценно,а по возрастанию первое число НЕ понимаю откуда появляется :wall:. Помогите решить данную...


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

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

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