Вернуться Форум Bashtel.RU > Разное > Компьютеры > Программирование
Ответ
 
Опции темы Опции просмотра

Параллельное программирование на Delphi
Старый 10.12.2008, 08:21   #1
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
Счастье Параллельное программирование на Delphi

Собственно имеется программа численного моделирования динамики доменных границ в магнетиках (РЗО), что не так уж и важно, а важно то что считает очень медленно. Требуется максимально эффективно задействовать ресурсы 2х-ядерного процессора). То бишь распараллелить её именно в Дельфи (Ну или хотя бы какой-нить мутной версии компилятора Паскаль). Вот и не знаю как это сделать с наименьшими потерями времени и мозга.
Может у кого-нить хоть какие-нить идеи есть , или слышал как это делается. Приветсвуются любые мысли (кроме "нафига оно тебе нужно")

Есть вообщем-то способ спрограммить несколько параллельных потоков, скажем два или четыре.

Есть глобальный массив, нужно чтобы четыре потока его параллельно обрабатывали, каждый выделенную ему часть. Можно поступить 2 способами:
1. Создать три дополнительных потока, задать им одинаковые приоритеты и пущай себе работают наряду с главным.
2. Создать четыре дополнительных потока, задать им одинаковые приоритеты, а главный "контролирует" их, управляет всякими внешними переменными.

В первом случае понятия не имею как задавать приоритет главному(основному) потоку. Уж не тот ли приоритет всего процесса, что правой кнопочкой в Диспетчере задач задается, а если это он и есть, то как программно задать его?

Во втором случае боюсь "встроенные средства оптимизации винды" из-за пятого (главного) потока не дадут равномерно работать четырем дополнительным, что опять сведет на нет мои попытки распараллелить.
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого

Последний раз редактировалось InternetStranger; 10.12.2008 в 10:04..
  Ответить с цитированием
 

Старый 15.12.2008, 12:30   #2
Пользователь
 
FrozenKing вне форума
Регистрация: 09.04.2006
Адрес: Салават
Сообщений: 82
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Собственно имеется программа численного моделирования динамики доменных границ в магнетиках (РЗО), что не так уж и важно, а важно то что считает очень медленно. Требуется максимально эффективно задействовать ресурсы 2х-ядерного процессора). То бишь распараллелить её именно в Дельфи (Ну или хотя бы какой-нить мутной версии компилятора Паскаль). Вот и не знаю как это сделать с наименьшими потерями времени и мозга.
Может у кого-нить хоть какие-нить идеи есть , или слышал как это делается. Приветсвуются любые мысли (кроме "нафига оно тебе нужно")

Есть вообщем-то способ спрограммить несколько параллельных потоков, скажем два или четыре.

Есть глобальный массив, нужно чтобы четыре потока его параллельно обрабатывали, каждый выделенную ему часть. Можно поступить 2 способами:
1. Создать три дополнительных потока, задать им одинаковые приоритеты и пущай себе работают наряду с главным.
2. Создать четыре дополнительных потока, задать им одинаковые приоритеты, а главный "контролирует" их, управляет всякими внешними переменными.

В первом случае понятия не имею как задавать приоритет главному(основному) потоку. Уж не тот ли приоритет всего процесса, что правой кнопочкой в Диспетчере задач задается, а если это он и есть, то как программно задать его?

Во втором случае боюсь "встроенные средства оптимизации винды" из-за пятого (главного) потока не дадут равномерно работать четырем дополнительным, что опять сведет на нет мои попытки распараллелить.
Тебе стоит почитать больше о потоках,процессах и тп в Win32 среде. Тогда поймеш что:
1. Все потоки данного процесса после создания имеют приоритет THREAD_PRIORITY_NORMAL.
2. Приоритет каждого потока как и процесса можно поменять на любой другой.
3. Потокам можно задавать независимые приоритеты друг от друга.

Чтобы задать приоритет потока используй WinAPI функцию SetThreadPriority
Системе все равно главный это у тебя поток или второстепенный для нее расчет времени на обработку расчитываеться исходя из приоритет всего процесса и потока в частности.

Чтобы назначить конкретному потоку определенное ядро(в твоем случае 1 или 2) нужно использовать функцию SetThreadAffinityMask. Если не задвать то по умолчанию шедулером ядра будет автоматически назначать менее занятое ядро твоего проца
__________________
IT Engineering/Programming Specialist
  Ответить с цитированием
 

Старый 16.12.2008, 11:37   #3
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

Вот спасиба)))!!!

Добавлено через 49 секунд
Цитата:
Сообщение от FrozenKing Посмотреть сообщение
Чтобы назначить конкретному потоку определенное ядро(в твоем случае 1 или 2) нужно использовать функцию SetThreadAffinityMask
вот от этого я особенно в восторге)). Потому как я упорно сам считал и от многих слышал, что многопоточность - это псевдопараллельность (что в принципе так и есть для одноядерных систем).
FrozenKing, раз уж в этом разбираешься, хотелось бы услышать твое мнение, годятся ли потоки для эффективного распараллеливания, а то все в округе (на спец.форумах) твердят, что это потоки - изобретение прошлых времен. Ничего короче кроме критики не слышал.

Добавлено через 12 минут
О результатах доложу))!
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого

Последний раз редактировалось InternetStranger; 16.12.2008 в 11:49.. Причина: Добавлено сообщение
  Ответить с цитированием
 

Старый 17.12.2008, 08:54   #4
Пользователь
 
FrozenKing вне форума
Регистрация: 09.04.2006
Адрес: Салават
Сообщений: 82
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Вот спасиба)))!!!

Добавлено через 49 секунд
вот от этого я особенно в восторге)). Потому как я упорно сам считал и от многих слышал, что многопоточность - это псевдопараллельность (что в принципе так и есть для одноядерных систем).
FrozenKing, раз уж в этом разбираешься, хотелось бы услышать твое мнение, годятся ли потоки для эффективного распараллеливания, а то все в округе (на спец.форумах) твердят, что это потоки - изобретение прошлых времен. Ничего короче кроме критики не слышал.

Добавлено через 12 минут
О результатах доложу))!
Ну насчет псевдопаралелбность ты правильно подметил что это это утверждение годиться только для одноядерных систем. В случае наличия нескольких ядер можно путем указанных выше манипуляций достигнуть чтобы по крайней мере в твоем случае 2 потока работали по настоящему паралельно и это по идее должно увеличить скорость.
Другой момент что в большинстве случаев эффективно распаралелить 1 задачу на несколько потоков не у всех получаеться и в этом вся проблема. Если тебе все таки это удастся сделать для твоей задачи то думаю ты получишь существенный прирост скорости. Конечно говорить о увеличении скорости в 2 раза не получиться в любом случае но думаю с 2 мя потоками при нормальной оптимизации алгоритма распаралеливания можно добиться увеличения на 70-90% в идеале. Ну естественна если реальных потоков будет больше и скорость будет выше. Хотел бы заметить что не стоит зацикливаться на мощностях 1 компьютера. В случае наличия эффективного алгоритма распаралеливания и нормальной сетки можешь попробывать создать серверную часть и клиентов которые будут уже обрабатывать задачу на нескольких машинах (распределенные вычислительны системы) что во много раз повысит эффективность и скорость. Все это теория конечно на практике сложнее. Самое главное разработай механизм распаралеливания на N количество потоков а дальше уже можно делать все что описано выше.
__________________
IT Engineering/Programming Specialist
  Ответить с цитированием
 

Старый 17.12.2008, 09:14   #5
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

Ну алгоритм распаралеливания на N потоков у мня уже давно готов и выдрессирован)) А насчет увеличения производительности - закон Амдала я знаю))
Мне кажется, что есть смысл попробоовать по-крайней мере с 4мя потоками поиграть - должен быть толк. Только не знаю как именно, по два чтоли повесить на каждое ядро?
И вовсе не собираюсь зацикливаться на 2х процессорах)).
У меня их целых 112 risk-процессоров на новенькой Palit 9800GT. Они следующие по в списке после CPU. Вот там реально мозг сломаешь на распараллеливанием. CUDA называется эта технология от nVidia.

Добавлено через 1 минуту
И еще небольшой вопрос технического плана: если объявлю глобальный массив в основном модуле (получается основном потоке), дополнительные потоки смогут его редактировать ?
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого

Последний раз редактировалось InternetStranger; 17.12.2008 в 09:15.. Причина: Добавлено сообщение
  Ответить с цитированием
 

Старый 17.12.2008, 11:52   #6
Пользователь
 
FrozenKing вне форума
Регистрация: 09.04.2006
Адрес: Салават
Сообщений: 82
По умолчанию

Попробуй сначала по 1 на ядро. сравни скорость а затем по 2 на ядро и тд увидишь разницу от дополнительного добавления потоков на 1 ядро.
Глобальный массив должен быть доступен всем потокам твоего приложения.
__________________
IT Engineering/Programming Specialist
  Ответить с цитированием
 

Старый 23.12.2008, 11:22   #7
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

Млин, меняю политику параллеливания. Самонадеянной оказалась попытка распараллелить то, что вычисляется меньше 1 мс, все равно больше времени тратится на синхронизацию (барьерную). В итоге прироста никакого(
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого
  Ответить с цитированием
 

Старый 23.12.2008, 12:07   #8
Пользователь
 
FrozenKing вне форума
Регистрация: 09.04.2006
Адрес: Салават
Сообщений: 82
По умолчанию

Ну естественно )). Получилось что твоя задача не требует паралельной обработки. Вот если бы она занимала хотя бы минуту и больше тут стоило бы подумать.
__________________
IT Engineering/Programming Specialist
  Ответить с цитированием
 

Старый 29.04.2009, 17:43   #9
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

Кстати, наконец-то нашел в Нете идею распараллеливания подобных задач)
Самый оптимальный способ по отношению прирост произврдительности / затраченные мозги - в качестве платформы использовать nVidia CUDA на видяхе 9800 GT (там 112 процессоров и 56 конвееров!!)).

С этим домашним "Кластером" не сравнится ни один современный процессор (вплоть до корэ-квадов от интела), разумеется при граммотном распаралеливании.

Никто ничем подобным не пробовал заниматься?)
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого

Последний раз редактировалось InternetStranger; 29.04.2009 в 17:52..
  Ответить с цитированием
 

Старый 13.05.2009, 23:56   #10
Пользователь
 
Аватар для PrAktikAnT
 
PrAktikAnT вне форума
Регистрация: 14.02.2009
Адрес: Уфа
Сообщений: 176
По умолчанию

было дело както нам дали задание написать клиент и сервер для отправки задач на расчет для суперкомпьютера (кросспоатформенно) а там уде программа распределяла задачу по процессорам (кста для УГАТУ)
А вот паралельным программированием незанимался
сейчас актуальный вопрос
В курсе асма препод об это даже заикался
Но мы этим не занимались
Но коекто пробовал распаралелить задачу на процессоры

а так понял из постов ты не будешь делить процессоры??? интерсно былобы посмотреть

Добавлено через 9 минут
InternetStranger,насчет видяхи меня тоже както мучал вопрос как можно перенести вычисления на видяху
Для этого нужна библиотека причем для каждой видяхи разная
Ну если можно к этому тока DirectX приспособить или Open GL да еще работа с ядрами
__________________
жми на бигбар (игра для ленивых)

Последний раз редактировалось PrAktikAnT; 14.05.2009 в 00:05.. Причина: Добавлено сообщение
  Ответить с цитированием
 

Старый 14.05.2009, 02:00   #11
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

)) PrAktikAnT, это ты верно подметил, что параллельное программирование очень перспективно (многие этого еще не понимают). вообщем вот что могу сказать после полугодичных попыток что-то распаралелить на центральном процессоре - полная лажа.
Во-первых, это все понты, кеши 3-го уровня, 4-х ядерные процессоры и прочее. Попытки их задействовать похожи на колдование с бубном. Весь интернет изрыл в поисках "простого" способа (для обычного программиста) использовать многоядерность ЦПУ и пришел к выводу, что это не серьезно)) Ну толку-то, от 4х ядер) хоть тресни, но в 4 раза быстрее вычислять не начнет)

Плюнув на все начал изучать программирование на видяхе. Ты кстати ошибаешься) Есть замечательная технология CUDA для видях ДжейФорса 8-й, 9-й и 200-й серий. Компилятор представляет собой расширенную версию С++ от nVidia (nvcc). Монтируется в Visual Studio 2005 и 2008 (включая бесплатные Express-версии). Так что владеть мутными секретами программирования директ-икса совсем не нужно - все уже давно сделано для людей)
Короче, мне как Delphi-кодеру потребовалось примерно 3 дня, чтоб разобраться и написать программу вычисления интеграла двойного интеграла (эта ресурсоемкая задача прекрасно параллелится).

Примерное ускорение на Palit 9800GT против AMD X2 5400+ в 45 раз!!
Доводилось в позапрошлом году эту задачу программировать на учебном кластере (суперкомпьютере) в БашГУ с производительностью 80 GFLOPS, состоящем из 16 двухядерников AMD Opertron. Добивались ускорения где-то в 5-15 раз. Всего-то ))

Если у тебя (или у кого-нить, кому интересно ) видяха принадлежит к одной из вышеперечисленных серий GeForce, могу представить сюда исходники и скомпиленную прогу)) Посмотреть, как оно выглядит)

зы: после таких результатов на далеко не самой крутой видяхе, дико захотелось 285GTX (в ней 240 процессоров))
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого
  Ответить с цитированием
 

Старый 14.05.2009, 12:46   #12
Пользователь
 
Аватар для PrAktikAnT
 
PrAktikAnT вне форума
Регистрация: 14.02.2009
Адрес: Уфа
Сообщений: 176
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Плюнув на все начал изучать программирование на видяхе. Ты кстати ошибаешься) Есть замечательная технология CUDA для видях ДжейФорса 8-й, 9-й и 200-й серий. Компилятор представляет собой расширенную версию С++ от nVidia (nvcc). Монтируется в Visual Studio 2005 и 2008 (включая бесплатные Express-версии). Так что владеть мутными секретами программирования директ-икса совсем не нужно - все уже давно сделано для людей)
мм весьма интересно
Но у меня видяха старая еще 6 ой версии
У меня одногруппник распаралеливал задачу кодя на асемблере как мне помниться или Visual C++ c асмвставками

Добавлено через 15 минут
Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Короче, мне как Delphi-кодеру потребовалось примерно 3 дня, чтоб разобраться и написать программу вычисления интеграла двойного интеграла (эта ресурсоемкая задача прекрасно параллелится).
А вычислял итеграл методами вычмата??
__________________
жми на бигбар (игра для ленивых)

Последний раз редактировалось PrAktikAnT; 14.05.2009 в 13:01.. Причина: Добавлено сообщение
  Ответить с цитированием
 

Старый 15.05.2009, 01:50   #13
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

Угу. Методом средних прямоугольников. Примитивный, но у него наиболее простая реализация.
Вспомнил еще один недостаток. Видяхи современные (покрайней мере большинство) не поддерживают двойную точность (в Си это тип double). Но пока еще не разобрался с этим)

зы: хотел блог создать с материалами по распараллеливанию, все руки не доходят и времени как всегда нет(
Ну если интересно будет, спрашивай - покажу че-нить)
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого
  Ответить с цитированием
 

Старый 17.05.2009, 17:07   #14
Мимо проходил
 
ДифУр вне форума
Регистрация: 17.05.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Если у тебя (или у кого-нить, кому интересно ) видяха принадлежит к одной из вышеперечисленных серий GeForce, могу представить сюда исходники и скомпиленную прогу)) Посмотреть, как оно выглядит)
Я для своей задачи (моделирование теплопереноса на СА) купил 250-ую.
был бы очень благодарен за реально работающий пример.
Ты кстати не пробывал делать оболочку на Delphi, а вычислительное ядро на CUDA??

Последний раз редактировалось ДифУр; 17.05.2009 в 17:10..
  Ответить с цитированием
 

Старый 18.05.2009, 03:57   #15
Местный
 
Аватар для InternetStranger
 
InternetStranger вне форума
Регистрация: 09.07.2006
Адрес: откуда надо...
Сообщений: 533
Отправить сообщение для InternetStranger с помощью ICQ
По умолчанию

)) Крутая весчъ )) А я себе на пока 9800GTX+ ))

Цитата:
Сообщение от ДифУр Посмотреть сообщение
Ты кстати не пробывал делать оболочку на Delphi, а вычислительное ядро на CUDA??
Именно это и хочу сделать, но даже не представляю как именно. Теоретически склепать dll'ку надо, которая все вычисления проводить на видяхе будет, остальная визуализация и обработка на Delphi.
Точно знаю, что можно. Полистай новости. нВидиа недавно конкурс проводила на лучшую прогу под CUDA. Там чувак призовое место занял. Его прога LINZIK (http://www.linzik.com/manual_rus/manual.htm) именно таким способом и написана.

Наипримитивнейший пример собственного производства - сложение 2х чисел. Никаких оптимизаций. Важно, что складывать будет видяха, а не CPU ))
Код:
/*  Сложение 2х чисел на видеокарте 
	Копирование с хоста (статические переменные) на видяху (динамические) */


#include <stdio.h>

// функция ядра
__global__ void GPU_Summ(int* A, int* B, int* R){ // все параметры по ссылке!
	*R = *A+*B;
}

int main(){
	cudaError_t ErrCode = cudaSuccess;

	// зададим 2 числа
	int A = 9;
	int B = 6;
	int Res = -110;
	printf(" A = %d   B= %d \n\n",A,B);
	
	// выделим для них память на видяхе
	int* pA = 0;
	int* pB = 0;
	int* pRes =0;
	ErrCode = cudaMalloc((void**)&pA,sizeof(int)); // вот тут нужно зачем-то Апперсанды ставить?!
	ErrCode = cudaMalloc((void**)&pB,sizeof(int));
	ErrCode = cudaMalloc((void**)&pRes,sizeof(int));

	// скопируем с хоста на девайс(видяху) эти значения
	ErrCode = cudaMemcpy(pA,&A,sizeof(int),cudaMemcpyHostToDevice);
	ErrCode = cudaMemcpy(pB,&B,sizeof(int),cudaMemcpyHostToDevice);
	ErrCode = cudaMemcpy(pRes,&Res,sizeof(int),cudaMemcpyHostToDevice);
	
	// вызов функции ядра
	GPU_Summ<<<1,1>>>(pA,pB,pRes);

	// результат oбратно копируем из видяхи на хост
	ErrCode = cudaMemcpy(&Res,pRes,sizeof(int),cudaMemcpyDeviceToHost);

	// печатаем результат
	printf("Summa = %d \n\n",Res);

	// контроль ошибок
	if (ErrCode != cudaSuccess)
		printf("CUDA Error :: \n");
}
Добавлено через 6 минут
ЗЫ: habrahabr.ru - вот блог, по которому я учился программить. там серия (около 5-8) статей плавного введения в Куду (ИМХО, лучший на сегодня Рунете). Вычисление интеграла покажу на пару дней позже (Комп новый купил, пока все заново установлю, настрою и т.д., да и стыдно показывать неотесанный код ))
__________________
Разработка веб-сайтов, скриптов и программного обеспечения. Программы для студентов. Delphi. Pascal. Быстро, четко и совсем не дорого

Последний раз редактировалось InternetStranger; 18.05.2009 в 04:04.. Причина: Добавлено сообщение
  Ответить с цитированием
 
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в EXCEL Velm113 Программирование 0 18.06.2011 17:57
Программирование на Delphi Vokial163 Программирование 3 17.05.2011 10:57
программирование artyrian Общение 2 19.01.2009 18:04
Программирование 6PAT Библиотека 11 29.05.2006 14:34



Текущее время: 05:58. Часовой пояс GMT +3.


vBulletin skin developed by: eXtremepixels
Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
top of page