здравствуйте!
столкнулся с такой интересной проблеммой. пишу программу для обработки данных которая будет крутиться на серваке с 2*Xeon работает достаточно шустро но вот даже в моменты максимальной загрузки т.е. когда прога выполняет самые сложные вычисления загружается только обно ядро процессора
а это может в дальнейшем сказаться на производительности.
я почемуто раньше всегда думал что за распределение ресурсов отвечает ОС но как выяснилось был неправ.
может кто нить сталкивался с подобной проблеммой?
помогите очень жду ваших советов
Здравствуйте, wellwell, Вы писали:
W>Эта функция позволяет привязать нужные потоки к разным CPU (если ядра видны как отдельные процессоры).
Я думаю, что человеку рановато думать о привязке потоков к процессам… У меня сложилось впечатление, что там ещё и потоков нет…
Здравствуйте, Ejik123, Вы писали:
E>я почемуто раньше всегда думал что за распределение ресурсов отвечает ОС но как выяснилось был неправ.
Занимается, занимается. А программа-то твоя многопоточная?
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: об использовании ресурсов процессора
От:
Аноним
Дата:
02.04.07 14:35
Оценка:
Здравствуйте, SeLarin, Вы писали:
SL>Здравствуйте, wellwell, Вы писали:
W>>Эта функция позволяет привязать нужные потоки к разным CPU (если ядра видны как отдельные процессоры). SL>Я думаю, что человеку рановато думать о привязке потоков к процессам… У меня сложилось впечатление, что там ещё и потоков нет…
Здравствуйте, Ejik123, Вы писали:
E>здравствуйте! E>столкнулся с такой интересной проблеммой. пишу программу для обработки данных которая будет крутиться на серваке с 2*Xeon работает достаточно шустро но вот даже в моменты максимальной загрузки т.е. когда прога выполняет самые сложные вычисления загружается только обно ядро процессора E>а это может в дальнейшем сказаться на производительности. E>я почемуто раньше всегда думал что за распределение ресурсов отвечает ОС но как выяснилось был неправ. E>может кто нить сталкивался с подобной проблеммой? E>помогите очень жду ваших советов
Все вычисления выдели в отдельный поток, а лучше в несколько потоков. В биосе должно быть включено HyperThreading.
да признаюсь программа однопоточная
просто у меня раньше небыло опыта в написании столь ресурсоемких приложений и одного потока вполне хватало. а сейчас совсем другая ситуация. буду очень благодарен за любую помощь...
Здравствуйте, Ejik123, Вы писали:
E>да признаюсь программа однопоточная E>просто у меня раньше небыло опыта в написании столь ресурсоемких приложений и одного потока вполне хватало. а сейчас совсем другая ситуация. буду очень благодарен за любую помощь...
Эх, как говориться знал бы прикуп, жил бы в Сочи. Я могу сказать илшь то, что используемы тобой алгоритм надо преобразовывать. Как — понятия не имею, поскольку не знаю твоего алгоритма, да и работа по распараллеливанию уже реализованных алгоритмов — то ещё удовольствие…
Здравствуйте, SeLarin, Вы писали:
SL>Эх, как говориться знал бы прикуп, жил бы в Сочи. Я могу сказать илшь то, что используемы тобой алгоритм надо преобразовывать. Как — понятия не имею, поскольку не знаю твоего алгоритма, да и работа по распараллеливанию уже реализованных алгоритмов — то ещё удовольствие…
даа очень радуют по утру такие сообщения
вся прога занимется там что берет данный из sql сервера обсчитывает их и кидает обратно в sql.
все у меня выделенно в отдельные процедуры.
а из всего вышесказанного я понял что можно как то запустить одновременно 2 процедуры. правильно??
Здравствуйте, Ejik123, Вы писали:
E>Здравствуйте, SeLarin, Вы писали:
SL>>Эх, как говориться знал бы прикуп, жил бы в Сочи. Я могу сказать илшь то, что используемы тобой алгоритм надо преобразовывать. Как — понятия не имею, поскольку не знаю твоего алгоритма, да и работа по распараллеливанию уже реализованных алгоритмов — то ещё удовольствие…
E>даа очень радуют по утру такие сообщения E>вся прога занимется там что берет данный из sql сервера обсчитывает их и кидает обратно в sql. E>все у меня выделенно в отдельные процедуры. E>а из всего вышесказанного я понял что можно как то запустить одновременно 2 процедуры. правильно??
Правильно. Попробуй почитать в хелпе про TThread.
Тебе нужно создать класс-наследник от TThread. Переопределить виртуальный метод Execute. В этом методе пиши свою процедуру общета.
Дальше есть 2 пути. Смысл в том, что когда Execute закончит выполнение, то надо будет убивать экземпляи твоего класса TMyThread и
создавать его заново, если нужно еще раз пощитать что-нить. Есть второй способ. Зацикливаешь Execute так:
procedure TMyThread.Execute;
begin
while not Terminated do
begin// ТВОЙ КОДend;
end;
Добавляешь в класс TThread метод типа "добавить новые данные для обсчета" скажем procedure AddNewData(//DATA//);
А в Execute добавляешь проверку "если данные не пусты, то посчитай, отправь ответ и очисти данные".
Создаешь поток — Create(true); {Если FALSE, то сразу стартанет}
Поток запускается после создания методом Resume;
Останавливается — Terminate;
Ждешь остановки — WaitFor;
Уничтожаешь экземпляр — Free;
Здравствуйте, Ejik123, Вы писали:
E>Здравствуйте, SeLarin, Вы писали:
SL>>Эх, как говориться знал бы прикуп, жил бы в Сочи. Я могу сказать илшь то, что используемы тобой алгоритм надо преобразовывать. Как — понятия не имею, поскольку не знаю твоего алгоритма, да и работа по распараллеливанию уже реализованных алгоритмов — то ещё удовольствие…
E>даа очень радуют по утру такие сообщения E>вся прога занимется там что берет данный из sql сервера обсчитывает их и кидает обратно в sql. E>все у меня выделенно в отдельные процедуры. E>а из всего вышесказанного я понял что можно как то запустить одновременно 2 процедуры. правильно??
Забыл сказать про синхронизацию. А то будут 2 потока пытаться одни данные изменить!
Пользуй критические секции. TCriticalSection
Создаешь экземпляр LockData : TCriticalSection;
Доступ к данным, которые могут одновременно изменяться из 2х и более потоков заключай в секцию
//......
LockData.Acquire;
// Работа с данными
LockData.Release;
//......
Здравствуйте, Ejik123, Вы писали:
E>даа очень радуют по утру такие сообщения E>вся прога занимется там что берет данный из sql сервера обсчитывает их и кидает обратно в sql. E>все у меня выделенно в отдельные процедуры. E>а из всего вышесказанного я понял что можно как то запустить одновременно 2 процедуры. правильно??
Теоретически можно, главное следить за тем, чтобы не было одновременного доступа разных потоков к одному и тому же ресурсу, правильно делать блокировки, синхронизацию и т.д. и т.п. Рассказывать про многопоточное программирование вкратце… Может кто-то и возьмётся…
Здравствуйте, Ejik123, Вы писали:
E>да признаюсь программа однопоточная E>просто у меня раньше небыло опыта в написании столь ресурсоемких приложений и одного потока вполне хватало. а сейчас совсем другая ситуация. буду очень благодарен за любую помощь...
Если изначально система не проектировалась, как многопоточная,
то ничего простох и быстрых решений для тебя видимо нету.
Скорей всего тебе надо будет пересмотреть самые основы и по чути все переделать заново.
Многопоточность на шару не получается.
Здравствуйте, Аноним, Вы писали:
А>Скорей всего тебе надо будет пересмотреть самые основы и по чути все переделать заново. А>Многопоточность на шару не получается.
Смотря какие там алгоритмы. Может очень просто получится, если там, например, основная нагрузка на цикл с независимыми итерациями
Re[5]: об использовании ресурсов процессора
От:
Аноним
Дата:
12.04.07 16:54
Оценка:
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Аноним, Вы писали:
А>>Скорей всего тебе надо будет пересмотреть самые основы и по чути все переделать заново. А>>Многопоточность на шару не получается.
FDS>Смотря какие там алгоритмы. Может очень просто получится, если там, например, основная нагрузка на цикл с независимыми итерациями
Ну и что?
Думаешь если просто на каждую итерацию запустить поток, то будет выигрышь?
При таком наивном подходе может быть запросто еще хуже.
На шару все равно не получится, особенно если в этом нету никакого опыта...