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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 23:22   #1
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию С++ Многопоточная обработка матрицы порядка 1000х1000

Задача такая:
Нужно написать прогу на С++, которая:
1. Создает динамический массив порядка 1000х1000..
2. Записывает в этот массив любые числа(заполняет его, (рандом))
3. Сохраняет массив в файле, с возможностью дальнейшего считывания..
4. Считает сумму элементов каждой строки, сортирует элементы каждой строки(по возрастанию)
5. Подсчёт и сортировку (Пункт 4), нужно выполнить двумя способами:
5.1. с использованием многопоточности
5.2. и без неё(т.е. обычным способом)
6. Нужно подсчитать и сравнить время в течении которого выполняются пункты 5.1. и 5.2. (если я не ошибаюсь это называется профилирование)

Всё это нужно сделать В Windows Form, но это я сам потом сделаю, из выше перечисленного сделал пункты 1, 2, 3, 4, 5.2 .. Коды выложу ниже..
Нужна помощь в пункте 6 и 5.1 … С таким пока ещё не сталкивался, поэтому и обратился..


Код:
#include "stdafx.h"
#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
//функция сортировки строк матрицы
void quickSort(int left, int right, int* arr)
{
int i = left, j = right;
double pivot = arr[(left + right) / 2];
while (i <= j)
{
while (arr[i] < pivot)
i++;
while (pivot < arr[j])
j--;
if (i <= j)
{
double tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
if (left < j)
quickSort(left, j, arr);
if (i < right)
quickSort(i, right, arr);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
int i=0,j=0,n=10,m=10,**a;
srand(time(0));
ofstream fout("mat.txt");
char stroka[3000];
//Выделение и заполнение памяти
 a=(int**)new int*[n];
 for(i=0;i<n;i++)
	{
	a[i]=new int[m];
	for(j=0;j<m;j++)
		{a[i][j]= rand() % 10 ;}//Заполняем матрицу числами от 0 до 9
	}

//Вывод матрицы на экран
 for(i=0;i<n;i++)
   {
   for(j=0;j<m;j++)
	  {cout<<a[i][j]<<" "; }
   cout<<endl;
   }
cout<<endl<<endl;
getch();
  
 
// подсчитаем сумму элементов в каждой строке
int *b = new int[n];
for(i=0;i<n;i++)
{b[i]=0;
   for(j=0;j<m;j++)
   {
	   b[i]+=a[i][j];
   }
cout<<b[i]<<" ";
}
cout<<endl<<endl;
getch(); 
// отсортируем строки
for (i=0; i<n; i++)
quickSort(0, m-1, a[i]);
// запишем матрицу в текстовый файл
fout<<n<<endl;
fout<<m<<endl;
for(i=0;i<n;i++)
   {
   for(j=0;j<m;j++)
		{fout<<a[i][j]<<" ";}
     fout<<endl;
   }
// считаем матрицу из текстового файла

ifstream inF("mat.txt");
if (!inF)
{
cout << endl << "Error !";
}
inF >>n;
inF >>m;
 a=(int**)new int*[n];
 for(i=0;i<n;i++)
	{
	a[i]=new int[m];
	for(j=0;j<m;j++)
		{inF >> a[i][j];}
	}

inF.close();
 for(i=0;i<n;i++)
 {
   for(j=0;j<m;j++)
   {
	   cout<<a[i][j]<<" ";

   }
   cout<<endl;
 }

getch();
//освободение памяти
delete[] b;
 for(i=0;i<n;i++)delete a[i];
 delete (int*)a;
 getch();
	return 0;
}
Borisov вне форума Ответить с цитированием
Старый 20.12.2010, 23:24   #2
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию

тут в моём коде матрица порядка 10х10, - это для наглядности, а так нужно просто поменять начальные значения n,m=1000
Borisov вне форума Ответить с цитированием
Старый 21.12.2010, 00:05   #3
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию

Вы хоть как то отпишитесь, может я как то не так написал.. некорректно поставил вопрос..
Borisov вне форума Ответить с цитированием
Старый 21.12.2010, 00:33   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

сделать несколько потоков, например в каждом потоке по 100 строк (100x1000) и пусть их стортирует, то есть на твой массив 10 таких потоков будет, в функции потока в конце каким-то образом сообщаешь что поток завершился можно сделать одну переменную - счетчик.. при запуске всего этого дела ей ставишь значение = количеству потоков. после того как функция потока заканчивается она вычитает из счетчика еденицу. Так как каждый поток у тебя работает с определенным куском массива то синхронизировать там ничего ненужно.. единственное переменную счетчик отметить как volatile. Вобщем у тебя получается функция потока которую ты запускаешь как отдельный поток и она у тебя должна обрабатывать определенный кусок массива(100x1000) - можно информацию об этом в параметре передать при запуске потока. псевдкод запуска и ожидание потоков при этом такой:

цикл по кол-ву потоков
{
создать и запустить поток(параметры, задающие кусок массива)
}

while(счетчик_работающих_потоков > 0)
{
Sleep(1);
}

месадж бокс("конец")

.. Как создавать потоки смотри в гугле.. функция вроде _BeginThreadEx зовецо но там много их всяких разных бывает)

Еще можно попробовать вручную ничего не создавать, а использовать OpenMP

Профилирование - либо используешь какието проги внешние для этого либо вначале интересующего участка кода узнаешь текущее время (GetTickCount()) а в конце участка опять узнаешь и вычитаешь из него прошлое время - получаешь время работы участка.. потом сравниваешь что быстрее отработало с потоками или без

ЗЫ: виндовс формс это .net хрень вобще)

Последний раз редактировалось UltimaBeaR; 21.12.2010 в 00:37.
UltimaBeaR вне форума Ответить с цитированием
Старый 21.12.2010, 01:03   #5
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию

Спасибо, есть над чем поработать..
Есть ещё предложения советы..? буду рад..

Цитата:
Сообщение от UltimaBeaR Посмотреть сообщение
ЗЫ: виндовс формс это .net хрень вобще)
Не совсем понял, что ты хотел этим сказать?
Borisov вне форума Ответить с цитированием
Старый 21.12.2010, 01:11   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Врядли будут другие предожения, поток тебе в любом случае придется создавать так же, единственное что можно менять это то что именно каждый поток будет делать. В потоках самое сложное это синхронизация - ее у тебя нету так что смело лезь в гугл и смотри как юзать потоки.

Windows Forms это окошки на .net - конкретная технология от мелкософта
UltimaBeaR вне форума Ответить с цитированием
Старый 21.12.2010, 06:17   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Каким образом вам нужно распараллелить программу? Способов есть много, но, думаю, самый простой - с помощью OpenMP. Тем более, что и код менять практически не придется, только навтыкать где нужно соответствующих OpenMP'шных прагм.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 21.12.2010, 08:25   #8
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию

Я почитал вчера немного про то о чём советовал UltimaBeaR, но сами понимаете время позднее, так что к ответу не созрел..
Гром, то что он самый простой и почти не нужно менять код.. это хорошо.. как раз то что нужно.. почитаю.. да, если есть куда направить, то направь.. (ссылочкой поделись если есть такая и не сложно)
Borisov вне форума Ответить с цитированием
Старый 21.12.2010, 09:08   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вот здесь можно почитать, довольно понятно.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 21.12.2010, 19:35   #10
Borisov
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 10
По умолчанию

Спасибо, тему прошу пока не закрывать, хочу довести до ума.. как созреет.. напишу что получилось
Borisov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование матрицы . Порядка [м,н]. Alex_sim Общие вопросы .NET 4 03.05.2010 23:14
Матрицы:функция изменения порядка столбцов матрицы Fajyz Помощь студентам 0 13.01.2010 09:40
Определение собственных значений для матрицы 2-го порядка Игорь777 Помощь студентам 0 26.04.2009 18:33
Формирование квадратной матрицы порядка n по заданному образцу. NeAlSe Помощь студентам 7 05.12.2007 16:04