16.10.2018, 12:14 [+3 UTC]
в нашей команде: 3 010 чел. | участники онлайн: 10 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.51 (29.09.2018)

Общие новости:
24.09.2018, 16:49

Форум:
14.10.2018, 19:20

Последний вопрос:
16.10.2018, 11:56

Последний ответ:
16.10.2018, 11:24

Последняя рассылка:
15.10.2018, 19:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
04.05.2013, 11:02 »
Киреенко Андрей Иванович
спасибо [вопрос № 187312, ответ № 272232]
16.12.2010, 23:56 »
Марина
Спасибо Вам огромное! [вопрос № 181285, ответ № 264799]
12.09.2011, 17:53 »
Посетитель - 372683
Спасибо за ответ! Было бы не плохо увидеть программу на Java. [вопрос № 184000, ответ № 268204]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 132
solowey
Статус: Студент
Рейтинг: 72
Андрей Кузнецов aka Dr_Andrew
Статус: Старший модератор
Рейтинг: 24

Перейти к консультации №:
 

Консультация онлайн # 140945
Раздел: • С / С++
Автор вопроса: Третьяченко Александр Сергееич
Отправлена: 29.07.2008, 05:22
Поступило ответов: 1

Уважаемые Эксперты, у мезя задача в увеличении скорости работы моих программ, перешел с VS 6 (2000) на VS 2005 и посему первый вопрос:

Cofiguration properties-C/C++-opttimization-maximzeSppeed(/O2) не знаю где установить O2 и посему получаю глобальную ошибку
1>cl : Command line error D8016 : '/O1' and '/RTC1' command-line options are incompatible
1>Build log was saved at "file://c:Documents and SettingsAleksanderМои документыVisual Studio 2005ProjectssungensungenDebugBuildLog.htm"
1>sungen - 1 error(s), 0 warning(s)
и стоит ли с этим связываться?

Теперь главный вопрос о работы программы на двух процессорах ( у меня core 2 duo)
Структура программы такова – массивы общих данных определены перед main программой, а наибольшая глубина вычислений в вызываемой из неё подпрограммой которая используя глобальные данные рассчитывает и возвращает значение по 250 примерам.
#include "stdafx.h"

inline int ff();

глобальные данные
static unsigned short indat [271] [10]; // ??????? ??????
static unsigned short sout [5] [200];

int _tmain(int argc, _TCHAR* argv[])
{

f=ff(); расчет 250 примеров
}
int ff()
{
for (i=0; i<250; i++) {

}
return n;
}

Теперь что я хочу, но запутался в статьях (стар и слаб на аглицкий):
#include "stdafx.h"

inline int ff1();
inline int ff2();

глобальные данные
static unsigned short indat [271] [10]; // ??????? ??????
static unsigned short sout [5] [200];

int _tmain(int argc, _TCHAR* argv[])
{

f1=ff1(); расчет 0-124 пример в основном потоке
f2=ff2(); расчет 125-249 пример на втором процессоре f=f1+f2;
}

int ff1()
{
for (i=0; i<125; i++) {

}
return n;
}

int ff2()
{
for (i=125; i<250; i++) {

}
return n;
}
Что надо добавить в то что я хочу? (#include ……………..)
Спасибо, извините за возможно путанный вопрос?
С уважением Александр

Состояние: Консультация закрыта

Ответ # 226929 от Aristos

Здравствуйте, Третьяченко Александр Сергееич!
Сначало по первому вопросу.
Настройки оптимизации находятся тут:
[Project Properties]/[Configuration Properties]/[C/C++]/[Optimization]/[Optimization] опции:
- Disabled (/Od)
- Minimize Size (/O1)
- Maximize Speed (/O2)
- Full Optimization (/Ox)
[Project Properties]/[Configuration Properties]/[C/C++]/[Code Generation]/[Basic Runtime Check] опции:
- Default
- Stack Frames (/RTCs)
- Uninitialized Variables (/RTCu)
- Both (/RTC1, equiv. to /RTCsu)
Несовместимость опций может быть вызвана противоречием в желании уменьшить размер и одновременно добавить код проверок времени исполнения (typeof, type_id и т.д.). Установка оптимизации размера программы, как мне кажется, морально устарела (объем НЖМД подрос, да и оперативной памяти обычно бывает вполне достаточно). Лучше ставить максимизацию скорости или полную оптимизацию.

По втрому вопросу. Как я понял, вы хотите ускорить время выполнения программы, задействовав оба процессора. Тут возможно 2 пути.
Первый заключается в использовании специализированного компилятора (от Intel), который сам выполняет распараллеливание кода, и оптимизирует его на исполнение на многопроцессорных (и многоядерных) системах.
Второй способ в меньшей степени зависит от компилятора и заключается в использовании нескольких потоков. Об этом способе расскажу подробней.
Каждая программа (процесс в системе) выполняется в 1 или нескольких потоках (thread). Потоки разделяют общую память процесса, но выполняются независимо друг от друга. Каждый поток может одновременно выполняться только на одном процессоре. Поэтому чтобы задействовать несколько процессоров, необходимо использовать несколько потоков. Подробнее про многопоточность можно прочитать по ссылке в приложении.
Для создания потока используется функция _beginthreadex (если и другие функции, но лучше использовать эту):
uintptr_t _beginthreadex(
void *security,
unsigned stack_size,
unsigned ( *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr);
Типичное использование:
#include <process.h>
...
unsigned RunFunc(void* arg); // функция потока
...
unsigned idThread; // id потока
int arg = 5;
HANDLE hThread = (HANDLE)_beginthreadex(0, 0, RunFunc, &arg, 0, &idThread);
...
Функция создает поток и запускает в нем на исполнение указаную функцию (RunFunc), которй передает заданный аргумент (arg), который может быть, например, указателем.
Узнать о состоянии потока (исполняется или уже завершился) можно с помощью функции WaitForSingleObject:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds);
Эта функция вернет будет ждать (dwMilliseconds миллисекунд) завершения потока и вернет константу WAIT_TIMEOUT, если истек таймаут ожидания, или досрочно вернет WAIT_OBJECT_0, если поток завершился.
Досрочно завершить поток можно с помощью функции TerminateThread:
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode);
В вашем, примере, можно часть вычислений выполнять в главном (первом) потоке, а для другой части создать дополнительный поток. Примерный код в приложении:
Так же почитайте хэлп по приведенным функциям.

Приложение:


Консультировал: Aristos
Дата отправки: 29.07.2008, 09:40

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.13659 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.51 от 29.09.2018