Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность 
:(
    Опции темы
Dennnis
Дата 31.3.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Запускаются они по очереди но работают одновременно.
Запуск потока занимает доли % от продолжительности его работы.
Запустить несколько потоков одновременно можно только в том случае если они запускаются разными потоками созданными до этого.
--------------------
Get Rich or Die Tryin'
PM   Вверх
Ronin08
Дата 31.3.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: 1
Всего: 1



Если я не ошибаюсь, то в последнем варианте кода 
Код

public static void MultyMatrix(int[,] A, int[,] B, int[,] C)
            {
                string  potstr;
                int potnum;
                Console.Write("Vvedite chislo potokov -> ");
                potstr = Console.ReadLine();
                potnum = Convert.ToInt16(potstr);
                int threadCount = potnum; //Количество потоков

                int time1, time2, timeres;
                time1= System.Environment.TickCount;

                if (A.GetLength(1) != B.GetLength(0))
                {
                    Console.WriteLine("MultMatr: ошибка размерности!");
                    return;
                }

                int len = A.GetLength(0);

                int range = len / threadCount; // кол-во векторов на кажный поток

                Thread thread;

                int begin = 0;
                int end = 0;
                for (int i = 0; i < threadCount - 1; i++)
                {
                    end = begin + range;
                    thread = new Thread(new ParameterizedThreadStart(Potok));
                    thread.Start(new object[] { begin, end, A, B, C });
                    
                }
                //Для последнего потока
                thread = new Thread(new ParameterizedThreadStart(Potok));
                thread.Start(new object[] { end, len, A, B, C });
                time2= System.Environment.TickCount;
                timeres = time1 - time2;
                Console.WriteLine(" Vremia vipolnenia {0}", timeres);
            }

            public static void Potok(object obj)
            {
                object[] arr = (object[])obj;
                int begin = (int)arr[0];
                int end = (int)arr[1];
                int[,] A = (int[,])arr[2];
                int[,] B = (int[,])arr[3];
                int[,] C = (int[,])arr[4];
                int len = A.GetLength(1);

                for (int i = begin; i < end; i++)
                {
                    for (int j = 0; j < len; j++)
                    {

                        int res = 0;
                        for (int k = 0; k < len; k++)
                        {
                            res += A[i, k] * B[k, j];
                        }
                        C[i, j] = res;

                    }
                }

            }

дело обстоит так: поток1 создался->просчитался эл-т матрици (или эллементы) -> поток1 запустился
потом следующий поток2 создался->просчитался эл-т матрици (или эллементы) -> поток2 запустился

а надо поток1 создался-> просчитался эл-т матрици (или эллементы)
потом следующий поток2 создался->просчитался эл-т матрици (или эллементы)
а уже потом
поток1 зпустился (Start)
поток1 зпустился (Start)
т.е. типа "Все потоки, айда запускайтесь"



Это сообщение отредактировал(а) Ronin08 - 31.3.2008, 20:44
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
marcusmae
Дата 31.3.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ronin08 @  31.3.2008,  20:24 Найти цитируемый пост)
Если я не ошибаюсь, то в последнем варианте кода


Ronin08, если я правильно понял, то Вы ошибаетесь. Содержимое Potok начинает выполняться в момент вызова метода Start для соответствующего потока. Можете считать, что потоки начинают работать почти одновременно, поскольку никакие два события не могут физически одновременно произойти на последовательной аппаратуре.

Разъясню ещё один момент : после вызова Start для одного из потоков, в основном потоке происходит немедленный (асинхронный) возврат. То есть, основной поток не ожидает, пока вспомогательный получит какой-либо результат в методе Potok, а спокойно себе идёт дальше по программе, то есть, последовательно вызывает метод Start для всех потоков. 

Это сообщение отредактировал(а) marcusmae - 31.3.2008, 21:31


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ronin08
Дата 31.3.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: 1
Всего: 1



marcusmae, все это понятно, что одновременно не может быть, что все процессы выполняются квазипараллельно и т.д.
Но давайте представим ситуацию, что нам надо перемножить матрицы 500*500 и при этом все вычисления надо разбить на 300 потоков, где гарантия, что все потоки будут задействованы!
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
marcusmae
Дата 31.3.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ronin08 @  31.3.2008,  21:48 Найти цитируемый пост)
где гарантия, что все потоки будут задействованы


Все ли будут задействованы - зависит от алгоритма. В текущем варианте, на сколько я могу видеть, некратный остаток от деления нагрузки на потоки вообще не учитывается. Кроме того, имеется ошибка, связанная с тем, что в цикле маркеры начала и конца - begin и end - не модифицируются. Рекомендую для начала прогнать многопоточный алгоритм, как он есть, в одном потоке (вместо t.Start вызывать Potok c соотв. аргументами). Ранее чем будут получены правильные результаты, говорить наверно не о чем, да?..


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Dennnis
Дата 31.3.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Цитата(marcusmae @  31.3.2008,  22:52 Найти цитируемый пост)
В текущем варианте, на сколько я могу видеть, некратный остаток от деления нагрузки на потоки вообще не учитывается.

Остаток от деления нагрузки на потоки выполняется последним созданным потоком.

Цитата(marcusmae @  31.3.2008,  22:52 Найти цитируемый пост)
Рекомендую для начала прогнать многопоточный алгоритм, как он есть, в одном потоке (вместо t.Start вызывать Potok c соотв. аргументами).

Прогонял - всё сходится (RND заменял на i + j smile )
--------------------
Get Rich or Die Tryin'
PM   Вверх
marcusmae
Дата 1.4.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Dennnis @  31.3.2008,  23:42 Найти цитируемый пост)
RND заменял на i + j


А зачем?

Уж не знаю, как проверяли... Вот здесь :

Код

                int begin = 0;
                int end = 0;
                for (int i = 0; i < threadCount - 1; i++)
                {
                    end = begin + range;


разве правильно, что end меняется единственный раз в таком цикле (не говоря уж о begin)? Или я чего-то недопонимаю?

Добавлено через 1 минуту и 53 секунды
Цитата(Dennnis @  31.3.2008,  23:42 Найти цитируемый пост)
Остаток от деления нагрузки на потоки выполняется последним созданным потоком.


Понял, вижу.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Dennnis
Дата 1.4.2008, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Цитата(marcusmae @  1.4.2008,  00:25 Найти цитируемый пост)
разве правильно, что end меняется единственный раз в таком цикле (не говоря уж о begin)? Или я чего-то недопонимаю?

Нет не правильно.
Вот как правильно:
Код

                int begin = 0;
                int end = 0;
                for (int i = 0; i < threadCount - 1; i++)
                {
                    end = begin + range;
                    thread = new Thread(new ParameterizedThreadStart(Potok));
                    thread.Start(new object[] { begin, end, A, B, C });
                    begin = end;
                }

Проверил с исправлениями, все нормально.
Исходник по которому считал в пр. файле.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Program.cs 7,28 Kb
--------------------
Get Rich or Die Tryin'
PM   Вверх
Ronin08
Дата 1.4.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: 1
Всего: 1



на сколько я знаю в С++ есть такое свойство suspend;
Например, xxx = create Thread(...,suspend);
это говорит о том, что после создания потоков, они "подвешиваются"
а потом можно просто в цикле запускать star;
О такой одновременности я говорил, так как на сомо создание потоков тратится много ресурсов;
 

Это сообщение отредактировал(а) Ronin08 - 1.4.2008, 20:34
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
marcusmae
Дата 1.4.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ronin08 @  1.4.2008,  20:34 Найти цитируемый пост)
на сколько я знаю в С++ есть такое свойство suspend


C++ - это язык, и у него нет свойств. Вероятно, речь о каком-то пакете, поддерживающем многопоточность? = Например, WINAPI или POSIX pThreads или boost::thread. Во всех трёх возможность Suspend присутствует в том или ином виде. Присутствует и в .NET - Thread.Suspend metod. 

Следующий тезис неверен :

Цитата(Ronin08 @  1.4.2008,  20:34 Найти цитируемый пост)
на сомо создание потоков тратится много ресурсов


При "создании" потока (new Thread(...)) ничего особенного не происходит, вся вычислительная сложность находится в методе Potok, который запустится только после вызова thread.Start(...).

Боюсь, сейчас Вы у себя делаете какие-то неверные выводы. Может, стоит увеличить теоретические познания?..


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ronin08
Дата 1.4.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: 1
Всего: 1



Цитата

C++ - это язык, и у него нет свойств

Можно было догадаться, что я описался smile 
я имел в виду у метода create Thread()
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
marcusmae
Дата 1.4.2008, 23:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Ronin08 @  1.4.2008,  22:23 Найти цитируемый пост)
я имел в виду у метода create Thread()


да, есть такой : CreateThread function. Ну можно, кстати, если скучно, и его поприменять в C#.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.