Страница: 1 |
Страница: 1 |
Вопрос: Ускорение цикла за счет количества потоков.
Добавлено: 26.11.09 14:57
Автор вопроса: SHS
Допустим есть цикл:
For i=1 to 1000
Console.Writeline(i)
Next
Как этот цикл выполнить в несколько потоков?
Чтоб количество потоков мог задать пользователь.
Тоесть если выбрано 10 потоков, то
Первый поток делает суммирование от 1 до 100
Второй поток от 100 до 200
.....
И тд и тп....
И одновременно.
Одним словом надо этот цикл оптимизировать по скорости за счет количества потоков.
Подойдет любой вариант, будь то BackgroundWorker или System.Threading.
Ато я уже голову сломал, нигде решения найти не могу...
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 26.11.09 20:55
Но должен предупредить что зачастую потоки не дают ощутимого преимущества в скорости.. Более эффективнее оптимизировать сам код..
Номер ответа: 2
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #2
Добавлено: 26.11.09 21:12
Ну блин. Если на кварде запускать не в один поток, а в четыре, то прирост весьма весьма ощутимый)) И вообще, не то что бы так или этак, а количество потоков должно равняться количеству ядер процессора, ибо тогда достигается наивысшая производительность. Измерено ручками. Не зря же 3Ds max, Maya и др. при рендеринге создают ровно столько потоков, сколько CPU, не больше, не меньше.
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 26.11.09 21:22
глупости... потоки никак не связаны с процессорами... если проц посчитает нужным, то все твои потоки будут работать на 1 ядре.. А вот новый FW позволяет распаралеллить вычисления именно по ядрам.. вот там да, реальный прирост в скорости.
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 26.11.09 21:39
Это в том случае, если задача сама хорошо параллелится. На многих задачах уже два потока синхронизациями сожрут больше половины производительности и будут работать медленнее одного. Наиболее удобно в дотнете параллелизация представлена в F#, конструкция async. В нормальном языке (тм) следует использовать промышленный стандарт OpenMP.
Номер ответа: 5
Автор ответа:
SHS
Вопросов: 2
Ответов: 5
Профиль | | #5
Добавлено: 26.11.09 21:48
Спасибо за ответ.
Перевел в код VB, который собственно мне и нужен:
Output:
Start - 0 Result: 0
Start - 100 Result: 100
Start - 200 Result: 200
Start - 300 Result: 300
Start - 400 Result: 400
Start - 600 Result: 600
Start - 500 Result: 500
Start - 800 Result: 800
Start - 700 Result: 700
Start - 900 Result: 900
Все верно получается?
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 26.11.09 22:38
нифига не верно..
http://clip2net.com/clip/m25397/1259264258-clip-31kb.jpg
Номер ответа: 7
Автор ответа:
SHS
Вопросов: 2
Ответов: 5
Профиль | | #7
Добавлено: 27.11.09 07:06
У меня нестыковка идет с переменной step в процедуре dowork. А именно (int)state + step. Требует объявления.
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 27.11.09 07:54
ну так правильно.. у меня эта переменая объявлена на уровне класса а у тебя на уровне процедуры.. разумеется у тебя она не попадает в зону видимости..
Номер ответа: 9
Автор ответа:
SHS
Вопросов: 2
Ответов: 5
Профиль | | #9
Добавлено: 27.11.09 13:21
Спасибо за помощь.
Работает.