Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 08.12.2009
Сообщений: 5
1

Распаралелить программу

08.12.2009, 20:03. Показов 750. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане!

Нужно распаралелить программу которая меняет местами столбцы 2-х мерного массива. Массив размером 10*10
Количество потоков - 5.
ОС- WindowsXP
IDE - MS Visual Studio 2008 C++

Вот я сделал её, но не приложу ума как распаралелить.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
SetConsoleOutputCP (1251);
    
int mas[10][10];
int i,j,n=10,stolbec_a,stolbec_b,buf;
 
cout << "Массив случайных чисел 10*10\n";
cout << endl;
 
 
/*-----------------------------Ввод массива------------------------------------*/
    for (i=0; i<n; i++) //строки
    for (j=0; j<n; j++) //столбцы  
    {mas[i][j]=rand()%50;}
 
 
/*--------------------------Вывод массива на экран-------------------------------*/
    for (i=0; i<n; i++) //строки
    {
    for (j=0; j<n; j++) //столбцы
    {cout << "a[" << i <<j << "]= " << mas[i][j] << "\t";}    
    cout << endl;
    }
 
/*------------------------Выбор столбцов для перемещения------------------------*/
cout << "\nВведите номер столбца 'A' который вы хотите поменять местами с столбцом В\n";
    cin >> stolbec_a;
cout << "Введите номер столбца 'B' (на место которого вы хотите поставить столбец А)\n";
    cin >> stolbec_b;
        if (stolbec_a >n && stolbec_b >n) 
        {
            cout << "Вы ввели недопустимые значения \n"; 
        }
cout << "Вы хотите поменять местами столбец номер " << stolbec_a <<" с столбцом номер " << stolbec_b << endl;
 
 
/*------------------------Перемещиние столбцов------------------------*/
for (i=0; i<n; i++)
{
buf = mas[i][stolbec_a];
mas[i][stolbec_a] = mas[i][stolbec_b];
mas[i][stolbec_b] = buf;
}
 
/*--------------------------Вывод результата на экран-------------------------------*/
    for (i=0; i<n; i++) //строки
    {
    for (j=0; j<n; j++) //столбцы
    {cout << "a[" << i <<j << "]= " << mas[i][j] << "\t";}    
    cout << endl;
    }
 
 
cin.get();
cin.get();
}
Пожалуйста, кто разбирается в ПАРАЛЛЕЛЬНОМ программировании, дайте совет, или хотя бы ссылкой пните). Заранее Благодарен!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2009, 20:03
Ответы с готовыми решениями:

Распаралелить select union all
Есть таблица куда нужно добавить записи из множества внешних таблиц ссылающихся на файлы из папок...

Распаралелить алгоритм нахождения кратчайшего пути
Здравствуйте. Помогите, пожалуйста, распаралелить алгоритм Дейкстры. Вообще идей нету как это можно...

Распаралелить работу с базой (фоновый процесс)
Проблема состоит в следующем. Когда пользователь запускает рассылку, то может идти пить чай --...

Как распаралелить цикл с помощью второго потока?
double Y(double p) { return sin(p); } void PrM ( double a1, double b1, int n1, double h1) {...

1
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.12.2009, 20:11 2
Принцип простой. Оформляешь функцию, которая будет делать всю работу в потоке. В твоём смехотворном случае задачей каждого потока будет обменять по 2 числа. Следовательно, функция получает информацию о самом массиве, номерах обмениваемых столбцов и номерах строк, которые надо обработать конкретному потоку. Для создания потоков воспользуйся функцией CreateThread. Она запускает в виде потоков функцию, принимающую указатель на void. Следовательно, тебе надо запихать передаваемую информацию в структурку и дать её адрес потоку. Потоковая функция преобразует адрес void* обратно к указателю на структурку и получит нужную информацию.
Возврат из CreateThread происходит, естественно, сразу. Запущенный поток начинает выполняться отдельно. Он закончится, когда потоковая функция закончит работу (ну или есть способы насильно прервать поток, но оно нам не надо).
CreateThread возвращает хэндл (описатель) созданного окна (тип HANDLE). В основном потоке запусти цикл, создающий 5 потоков и собирающий описатели созданных потоков в массив. После чего дождись окончания работы всех потоков при помощи функии WaitForMultipleObjects. На этот момент работа будет завершена и тебе останется вывести результат.
1
09.12.2009, 20:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2009, 20:11
Помогаю со студенческими работами здесь

Как лучше распаралелить задачи, если их количество больше ядер процессора?
Есть много задач Task task1 = new Task(() =&gt; { ...

Составить блок-схему и программу вычисления значения функции + написать программу
Прошу решить в качестве проверки. Нужно сдать в понедельник. Буду очень благодарен! Заранее...

Зациклить программу, чтобы был выбор: продолжать программу или нет
Доброго времени суток. Помогите зациклить программу, чтобы был выбор продолжать программу или нет....

Реализация продления оплаты за программу (помесячная оплата подписки на программу)
Создал прогу, теперь мне надо её продавать, но так что-бы она работала месяц(Помесячная плата)...


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

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