Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный вывод - достижимо ли ускорение, по сравнению с обычным выводом 
V
    Опции темы
marcusmae
Дата 24.1.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Всем привет,

Изучаю, как можно было бы занять процессор полезной работой в то немаленькое число тактов, в которое он "занят" ожиданием появления результата на контроллере шины IDE.

В стандарте Linux существует пакет POSIX AIO (asyncronious i/o), в котором есть функции aio_read и aio_write. Особенность в том, что возврат из них происходит сразу же после вызова, без ожидания результата операции, отложенная обработка которого может быть осуществлена по сигналу.

На этот счёт вопрос : достижимо ли хоть какое-то ускорение работы приложения при использовании асинхронного вывода вместо обычного?

Из тех тестов, что я провёл следует, что нет, не достижимо. Но, во-первых, я мог где-то и наляпать smile (здесь описано примерно то, что я делаю), а, во-вторых, интересно, что же у этой "асинхронности" под капотом? Если она сводится к созданию потока/контекста, в котором идёт обычный ввод/вывод, то это, конечно, ерунда. Но в таком случае странно, что эту технологию любят применять в realtime-системах.


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


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Цитата

Если она сводится к созданию потока/контекста, в котором идёт обычный ввод/вывод, то это, конечно, ерунда. Но в таком случае странно, что эту технологию любят применять в realtime-системах

Именно так. Тупо создаётся новый поток. Только в Linux'е. В других ОС, к примеру FreeBSD, на сколько знаю - сделано всё как надо...


--------------------
PM MAIL WWW   Вверх
marcusmae
Дата 24.1.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(GrayCardinal @  24.1.2008,  18:07 Найти цитируемый пост)
Именно так. Тупо создаётся новый поток. Только в Linux'е. В других ОС, к примеру FreeBSD, на сколько знаю - сделано всё как надо...


GrayCardinal, спасибо за ответ! = Хм, интересно, выходит, на разных системах разная реализация POSIX AIO API? В таком случае, я попробую поставить к себе в VMWARE какой-нибудь FreeBSD и провести тесты там...


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


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Ещё хочу добавить, что в NetBSD, OpenBSD aio_ отсутствует...
http://nixdoc.net/man-pages/FreeBSD/?cmst=...sss=&cmss=2
(или я плохо смотрел ? )

Это сообщение отредактировал(а) GrayCardinal - 24.1.2008, 20:06


--------------------
PM MAIL WWW   Вверх
marcusmae
Дата 24.1.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(GrayCardinal @  24.1.2008,  20:04 Найти цитируемый пост)
или я плохо смотрел ?

Я бы сказал, что приведённая Вами ссылка - вообще единственное место, где упоминается aio безотносительно выбора системы на левом фрейме smile 

Ну, на SuSE, кстати, libaio ставится отдельно.



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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Добавлено @ 21:17
Цитата(marcusmae @  24.1.2008,  15:20 Найти цитируемый пост)
На этот счёт вопрос : достижимо ли хоть какое-то ускорение работы приложения при использовании асинхронного вывода вместо обычного?

да
пример
сервер + система логирования


Это сообщение отредактировал(а) MAKCim - 24.1.2008, 21:24


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
marcusmae
Дата 24.1.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



MAKCim, у меня тоже есть повод для оптимизма : я получил ускорение для Windows - мне это удобнее всего smile Только толку от этого немного, поскольку, во-первых, там никакого POSIX AIO, а функции из kernel32, и во-вторых мне нужен вариант именно для Linux-систем.


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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



marcusmae, 
вопрос то в чем?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
marcusmae
Дата 24.1.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



MAKCim, вопрос в том, что асинхронный вывод под OpenSuSE работает медленнее обычного вывода с блокировкой.

Вот код с использованием aio_write :

Код

#define SIG_AIO SIGRTMIN+5

    // The async serialization boost wrapper.
    template<typename T> struct SerializeAsyncBinary {

        // The timeout between two sequential async operation status retrievings
        // in seconds.
        static const int GET_STATUS_TIMEOUT = 1; // seconds

        const GridVariable2d_Base<T>* var;
        const char* filename;

        aiocb* aioControlBlock;
        struct sigaction* action;

        SerializeAsyncBinary(const GridVariable2d_Base<T>* var,
            const char* filename) :

        var(var), filename(filename),
        aioControlBlock(new aiocb()), action(new struct sigaction())

        {
            // Fill the AIO control block structure with zeros.
            bzero(this->aioControlBlock, sizeof(aiocb)); 

            // Setup the signal handler.
            this->action->sa_sigaction = SerializeAsyncBinary::aioHandler;
            this->action->sa_flags = SA_SIGINFO;
            sigemptyset(&this->action->sa_mask);
            sigaction(SIG_AIO, this->action, NULL);

            this->aioControlBlock->aio_fildes = open(filename, O_CREAT | O_WRONLY); 
            this->aioControlBlock->aio_offset = 0; 
            this->aioControlBlock->aio_buf = (void*)var->dataInstance; 
            this->aioControlBlock->aio_nbytes = var->size; 
            this->aioControlBlock->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
            this->aioControlBlock->aio_sigevent.sigev_signo = SIG_AIO;
            this->aioControlBlock->aio_sigevent.sigev_value.sival_ptr = this;
            this->aioControlBlock->aio_reqprio = 1;
            
            if (aio_write(this->aioControlBlock))
                throw std::logic_error("Te file write operation failed.");            
        }

        static void aioHandler(int signal, siginfo_t* info, void* uap) {

            if (signal = SIG_AIO)
            {
                SerializeAsyncBinary<T>* async = (SerializeAsyncBinary<T>*)info->si_value.sival_ptr;
                if (aio_return(async->aioControlBlock) != async->var->size)
                    throw std::logic_error("The number of bytes written mismatch.");
                delete async;
            }
        }

        ~SerializeAsyncBinary() {

            close(this->aioControlBlock->aio_fildes);

            delete this->action;
            delete this->aioControlBlock;

            delete this->var;
            delete this->filename;
        }
    };


А вот обычный вывод :

Код

    // Serialize the specified 3d grid variable instance.
    static void Serialize(
        const GridVariable3d<T>* var3d, const char* filename) {
        std::ofstream file(filename, ios::out | ios::binary);

        if (var3d->composite)
        {
            // Write the header and data separately.
            file.write((char*)var3d->dataInstance, GridVariable3d::HEADERSIZE);
            file.write((char*)var3d->values,  var3d->nv * sizeof(T));
        }
        else
            // Write the header and data simultaneously.
            file.write((char*)var3d->dataInstance, var3d->size);

        file.close();
    }






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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



marcusmae, 
естественно, асинхронный I/O не в любом случае дает преимущества
он оправдан, когда приходится читать или писать большие объемы данных, и этот процесс не должен снижать интерактивность
больший выигрыш можно получить на MP-системе


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
marcusmae
Дата 24.1.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(MAKCim @  24.1.2008,  22:42 Найти цитируемый пост)
он оправдан, когда приходится читать или писать большие объемы данных


Сколько? У меня разом пишется 200мб на фоне ёмких вычислений. То есть, выводы не накладываются др на друга. Да и под виндовс ускоряется.

Цитата

больший выигрыш можно получить на MP-системе


на многоядерной то есть?

Это сообщение отредактировал(а) marcusmae - 24.1.2008, 22:52


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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(marcusmae @  24.1.2008,  22:50 Найти цитируемый пост)
на многоядерной то есть?

на любой MP
в том числе многоядерной
Цитата(marcusmae @  24.1.2008,  22:50 Найти цитируемый пост)
Сколько? У меня разом пишется 200мб на фоне ёмких вычислений. То есть, выводы не накладываются др на друга. Да и под виндовс ускоряется.

ну 200МБ это достаточно много
а как ты скорость замерял?

Это сообщение отредактировал(а) MAKCim - 24.1.2008, 23:04


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
marcusmae
Дата 24.1.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(MAKCim @  24.1.2008,  23:02 Найти цитируемый пост)
а как ты скорость замерял?


На стороне теста (fortran) :

Код

call cpu_time(beginTime)
...
call cpu_time(endTime)


не самый лучший способ для экстремального тайминга : у этой функции не очень хорошее разрешение. Но значительные различия она улавливает.

А многоядерность - всё же странное решение проблемы. Освобождая от тормозов, связанных с выводом одно ядро, это счастье просто прибывает другому ядру.

Это сообщение отредактировал(а) marcusmae - 24.1.2008, 23:37


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


stravaganza
**


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

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



GrayCardinal, я включил PCBSD. Вижу, поставить на него компиляторы Intel - целая проблема. Хотя, возможно, имея средство двоичной совместимости, можно попытаться запустить там уже готовые бинарники...


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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



marcusmae, 
разница в том, что уведомление о завершении операции асинхронного I/O приходит после физической записи данных на устройство
если же использовать обычные операции write()/read() (без O_SYNC), то они возвращают управление после отправки пакета bio планировщику I/O, т. е до физической записи на устройство
поэтому время работы асинхронных функций при таком способе измерения времени больше
тем более у тебя в примере используется ofstream :: write(), который так же как и fwrite() буферизируем, т. е возврат управления может происходить еще раньше (нет обращения к ядру, а данные записываются в user-level буфер)

Цитата(marcusmae @  24.1.2008,  23:16 Найти цитируемый пост)
А многоядерность - всё же странное решение проблемы

я такого не говорил
читай внимательнее
MP - это способ повысить общее быстродействие приложения, использующее операции асинхронного I/O


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




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


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

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