Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2009, 19:29   #1
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию Распаралелить программу

Здравствуйте уважаемые форумчане!

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

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

Код:
#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();
}
Пожалуйста, кто разбирается в ПАРАЛЛЕЛЬНОМ программировании, дайте совет, или хотябы ссылкой пните). Заранее Благодарен!

Последний раз редактировалось MaxDDT; 08.12.2009 в 19:46. Причина: уточнение данных
MaxDDT вне форума Ответить с цитированием
Старый 08.12.2009, 19:42   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2MaxDDT
Цитата:
Количество процессоров - 5.
может потоков?
реализация зависит от ос
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.12.2009, 19:47   #3
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

2pproger

Да, потоков. Я там в сообщении всё уточнил.
MaxDDT вне форума Ответить с цитированием
Старый 08.12.2009, 20:24   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

честно - идеотское задание на параллелизм. тут и распараллеливать то нечего. была ба какая нить сортировка хотяб...
ну что вижу. пусть каждый поток вполнит свою часть перестановки столбцов.
например:
Цитата:
первый поток:
for (i=0; i<2; i++) {
buf = mas[i][stolbec_a];
mas[i][stolbec_a] = mas[i][stolbec_b];
mas[i][stolbec_b] = buf;
}

...

пятый поток:
for (i=8; i<10; i++) {
buf = mas[i][stolbec_a];
mas[i][stolbec_a] = mas[i][stolbec_b];
mas[i][stolbec_b] = buf;
}
по работе с потоками смотри в msdn createThread. В твоем случае хватит только этой функции. в функцию потока передашь указатель на массив и номера строк колонки, которые Энный поток должен переставить. дальше просто создаешь 5 потоков с нужными параметрами. все.

но опять же скажу, что это все бредятина, ибо вполнение потока закончится практически моментально.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.12.2009, 20:46   #5
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Согласен что бредятина! Но "приказ" есть "приказ"! Я примерно так и думал. Но мне сказали что может возникнуть проблема с доступом к памяти. Типа одновременно к массиву будут подключатся 5 потоков, хотя я лично не пойму в чём проблемма.

Спасибо большое попробую помучится, когда будет какой-то результат, отпишусь.
MaxDDT вне форума Ответить с цитированием
Старый 08.12.2009, 22:01   #6
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Оказывается что использовать функция CreateThread() есть смысл лишь тогда, когда в коде не используются стандартные функции библиотеки С, такие как например printf() или strcmp(). Проблемма в том что функции стандартной библиотеки С не предназначены для использования в Win32 АРІ, и для того чтобы создать поток необходимо во время создания и завершения потока выполнять некоторые действия, все эти действия уже включены в функцию _beginthreadex() для создания потока и _endthreadex() – для завершения потока. эти функции описаны в ргосеss.h (информация из методички)
MaxDDT вне форума Ответить с цитированием
Старый 08.12.2009, 22:53   #7
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

эмм, у меня тут тоже есть вопросик небольшой(потоки особо не изучал, но интересно же)
вот допустим обычный тупо-поток я создаю так (в MFC)
Код:
UINT proc2(LPVOID Param)
{
	AfxMessageBox("proc2!");
	return 0;
}

void CMyDlg::OnBnClickedOk() 
{
 AfxMessageBox("main proc");
 AfxBeginThread(proc2,this);
}
а что делать если нужен поток-член класса? того же диалога например(чтоб доступ получить ко всем данным)
m0nax вне форума Ответить с цитированием
Старый 08.12.2009, 23:32   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

для оных целей метод должен быть статическим, что по сути сразу исключает возможность доступа к полям, принадлежащим какому-то конкретному объекту(так как в статические методы не передаётся this). С другой стороны можно собственноручно передать в него this и тогда через него получать доступ к приватным полям класса
netrino вне форума Ответить с цитированием
Старый 11.12.2009, 17:14   #9
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию

Кто может взяться за это задание, и за какую сумму?

Интересует вариант с подробными комментариями.
MaxDDT вне форума Ответить с цитированием
Старый 12.12.2009, 01:55   #10
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

вот так вроде работает
не очень красиво правда - пока не получилось передать в поток указатель на двумерный массив как предложил pproger, пришлось чуток схалтурить )


Код:
#include "windows.h"
#include "Process.h"
#include <iostream> 
using namespace std;

const int n = 10;
int mas[n][n];

int stolbec_a=0, stolbec_b=0, 
buf=0, i=0, j=0;

void Print();

unsigned __stdcall proc(void* pParam)
{	
	//int temp = i + 2 ;	
	for (int i = (int)pParam; i < (int)pParam + 2; i++)
	{
		buf = mas[i][stolbec_a];
		mas[i][stolbec_a] = mas[i][stolbec_b];
		mas[i][stolbec_b] = buf;
	}
	return 0;
}

void main(){
	//setlocale(LC_ALL, ".1251");

	cout << "Массив случайных чисел 10*10\n";
	cout << endl;
	/*-----------------------------Ввод массива------------------------------------*/
	for (i=0; i<n; i++) //строки
		for (j=0; j<n; j++) //столбцы  
		{mas[i][j]=rand()%50;}
		/*--------------------------Вывод массива на экран-------------------------------*/
		Print();
		/*------------------------Выбор столбцов для перемещения------------------------*/
		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;

		//////////////////////////////////////////////////////////////////////////
		HANDLE ArrayThreads[5];
		
		for (int i=0, k=0; i < n; i+=2, ++k )
		{
			//Sleep(250);
			ArrayThreads[k] = (HANDLE)_beginthreadex(0,0,proc, (void*)i, 0,0) ;
		}

		WaitForMultipleObjects(5, ArrayThreads, TRUE, INFINITE);
		for (i=0; i<5; ++i)
			CloseHandle(ArrayThreads[i]) ;
		//////////////////////////////////////////////////////////////////////////

		/*--------------------------Вывод результата на экран-------------------------------*/
		Print();


		system("PAUSE");
}

void Print()
{
	for (i=0; i< n; i++) //строки
	{
		for (j=0; j< n; j++) //столбцы
		{
			cout << mas[i][j] << "\t" ;
			//cout << "a[" << i <<j << "]= " << mas[i][j] << "\t";
		}	
		cout << endl;
	}
}

Последний раз редактировалось m0nax; 12.12.2009 в 20:21.
m0nax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57
Оцените программу cheef Софт 11 30.04.2009 09:28
Защитить программу. С.М.С Безопасность, Шифрование 10 23.02.2009 00:35
Разобрать программу DarkDeivel Общие вопросы Delphi 13 21.09.2008 14:17
Написать программу. project.one Фриланс 3 17.06.2008 16:11