OpenCL

Поделись знанием:
Перейти к: навигация, поиск
OpenCL
Тип

API

Разработчик

Apple Inc., Khronos Group

Операционная система

Кроссплатформенное программное обеспечение

Первый выпуск

28 августа 2009

Последняя версия

2.1 (16 ноября 2015)

Лицензия

Свободная

Сайт

[www.khronos.org/opencl/ onos.org/opencl/]

К:Википедия:Статьи без изображений (тип: не указан)К:Программное обеспечение, разработанное в 2009 году

OpenCL (от англ. Open Computing Language — открытый язык вычислений) — фреймворк для написания компьютерных программ, связанных с параллельными вычислениями на различных графических (англ. GPU) и центральных процессорах (англ. CPU), а также FPGA. Вo фреймворк OpenCL входят язык программирования, который базируется на стандарте C99, и интерфейс программирования приложений (англ. API). OpenCL обеспечивает параллелизм на уровне инструкций и на уровне данных и является реализацией техники GPGPU. OpenCL является полностью открытым стандартом, его использование не облагается лицензионными отчислениями.

Цель OpenCL состоит в том, чтобы дополнить OpenGL и OpenAL, которые являются открытыми отраслевыми стандартами для трёхмерной компьютерной графики и звука, пользуясь возможностями GPU. OpenCL разрабатывается и поддерживается некоммерческим консорциумом Khronos Group, в который входят много крупных компаний, включая AMD, Apple, ARM, Intel, Nvidia, Sony Computer Entertainment, Sun Microsystems и другие.





История

OpenCL первоначально был разработан в компании Apple Inc. Apple внесла предложения по разработке спецификации в комитет Khronos. Вскоре компания AMD решила поддержать разработку OpenCL (и DirectX 11), который должен заменить фреймворк Close to Metal. [1] [2]

16 июня 2008 года была сформирована рабочая группа Khronos Compute для разработки спецификаций OpenCL. В неё вошли Apple, nVidia, AMD, IBM, Intel, ARM, Motorola и другие компании, в том числе специализирующиеся на создании компьютерных игр. Работа велась в течение пяти месяцев, по истечении которых 9 декабря 2008 года организация Khronos Group представила первую версию стандарта.

OpenCL 1.0 был впервые показан публике 9 июня 2008, а выпущен вместе с Mac OS X 10.6, 28 августа 2009 года. [3]

5 апреля 2009 года компания AMD анонсировала доступность для загрузки beta-версии комплекта разработчика ATI Stream SDK v2.0 в который входит язык мультипроцессорного программирования OpenCL.

20 апреля 2009 года nVidia представила бета-драйвер и комплект для разработки программного обеспечения (SDK) с поддержкой открытого GPGPU-стандарта OpenCL. Данный бета-драйвер предназначен для разработчиков, участвующих в программе «OpenCL Early Access», которые уже с 20 апреля могут принять участие в тестировании бета-версии. Для участников программы «GPU Computing Registered Developers» бета-версия драйвера OpenCL будет доступна позже.[4][5][6]

26 ноября 2009 года компания nVidia выпустила драйвер с поддержкой OpenCL 1.0 (rev 48).

Для получения наглядного представления, как технология OpenCL использует возможности 24-ядерной системы для отрисовки видеоэффектов, рекомендуется посмотреть следующий демо-ролик: [www.youtube.com/watch?v=7PAiCinmP9Y].

OpenCL 1.1 был представлен организацией Khronos Group 14 июня 2010 года. В новой версии значительно расширены функциональные возможности для параллельного программирования, гибкость и производительность, а также добавлены новые возможности.

  • Новые типы данных, включая 3-компонентные векторы и дополнительные форматы изображений.
  • Обработка команд из нескольких потоков хоста и обработки буфера между несколькими устройствами.
  • Операции по регионам буфера включая чтение, запись и копирование 1D, 2D или 3D прямоугольных областей.
  • Расширенное использование события для управления и контроля выполнения команд.
  • Улучшенное взаимодействие с OpenGL за счет эффективного обмена изображениями.

OpenCL 1.2 был представлен 15 ноября 2011 года. В новой версии отмечено множество небольших улучшений, связанных с увеличением гибкости языка и оптимизацией производительности. В OpenCL 1.2 был добавлен ряд значительных новшеств.

  • Партицирование устройств — возможность разбиения на уровне OpenCL-приложения устройства на несколько подустройств для непосредственной привязки работ к конкретным вычислительным блокам, резервирования ресурсов для более приоритетных задач или более эффективного совместного использования аппаратных ресурсов, таких как кэш.
  • Раздельная компиляция и связывание объектов — появилась возможность создания динамических библиотек, позволяющих использовать в сторонних программах, ранее реализованные подпрограммы с OpenCL-вычислениями.
  • Расширенная поддержка изображений, включая возможность работы с одномерными изображениями и массивами одномерных или двухмерных изображений. Кроме того, в расширении для организации совместного доступа (sharing) добавлена возможность создания OpenCL-изображения на основе отдельных текстур OpenGL или массивов текстур.
  • Встроенные OpenCL-ядра теперь позволяют использовать возможности специализированного или непрограммируемого аппаратного обеспечения и связанных с ним прошивок. Например, появилась возможность использования возможностей и более тесной интеграции с фреймворком OpenCL таких устройств, как DSP-процессоры или видео кодировщики/декодировщики.
  • Возможность бесшовного совместного использования поверхностей (Media Surface Sharing) между OpenCL и API DirectX 9/11.

OpenCL 2.0 был представлен 22 июля 2013 года[7] и стандартизирован 18 ноября того же года[8].

  • Общая виртуальная память - Позволяет ядрам узла и устройств совместно использовать структуры данных, основанные на комплексных адресных ссылках, устраняя явные пересылки между узлом и устройствами, повышая при этом гибкость программирования.
  • Вложенный параллелизм - Обновление улучшило возможности программирования и увеличило производительность приложений.
  • Универсальное адресное пространство - Позволяет записать функции без наименования адресного пространства, что повышает гибкость и экономит время за счет устранения необходимости записи нескольких функций.
  • Атомарные операции C11 со стороны устройства - Подмножество атомарных и синхронизирующих операций C11 обеспечивает параллельное выполнение потоков для безопасной работы над общими наборами данных.
  • Каналы - Объекты памяти, организованные по принципу FIFO, что упрощает структуры данных общей очереди.

OpenCL 2.1 был представлен 3 марта 2015 года и стандартизирован 16 ноября того же года. В нем было переписано ядро с языка C на C++14.

События

  • 3 марта 2011 — Khronos Group объявляет о создании рабочей группы WebCL для разработки JavaScript-интерфейса к стандарту OpenCL. Это создает потенциал для того, чтобы использовать GPU и многоядерных процессоры для параллельной обработки вычислений в веб-браузере.[9]
  • 4 мая 2011 — подразделение Nokia Research представило открытое расширение WebCL для браузера Firefox.[9]
  • 1 июля 2011 — Samsung Electronics представила открытый прототип WebCL для движка WebKit.[9]
  • 8 августа 2011 — AMD выпустила OpenCL-драйвер AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5, заменив ATI Stream SDK.
  • 15 ноября 2011 — комитет Khronos представил обновлённую спецификацию OpenCL 1.2. В новой версии отмечено множество небольших улучшений, связанных с увеличением гибкости языка и оптимизацией производительности.
  • 1 декабря 2012 — комитет Khronos представил очередное обновление спецификации OpenCL 1.2. В новой версии улучшено взаимодействие с OpenGL, улучшена безопасность в WebGL, добавлена поддержка загрузки OpenCL программ из промежуточного представления SPIR.

Особенности языка

Ключевыми отличиями используемого языка от Си (стандарт ISO 1999 года) являются:

  • отсутствие поддержки указателей на функции, рекурсии, битовых полей, массивов переменной длины (VLA), стандартных заголовочных файлов[10];
  • расширения языка для параллелизма: векторные типы, синхронизация, функции для Work-items/Work-Groups[10];
  • квалификаторы типов памяти: __global, __local, __constant, __private;
  • иной набор встроенных функций.

Примеры

Пример вычисления БПФ: [11]

  // создание вычислительного контекста для GPU (видеокарты)
  context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);

  // создание очереди команд
  queue = clCreateCommandQueue(context, NULL, 0, NULL);

  // выделение памяти в виде буферов
  memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);
  memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);

  // создание программы из исходных текстов
  program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);

  // компиляция программы
  clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

  // создание объекта kernel из скомпилированной программы
  kernel = clCreateKernel(program, "fft1D_1024", NULL);

  // подготовка аргументов
  clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
  clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
  clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);
  clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);

  // задание N-D диапазона с размерностями work-item и отправка в очередь исполнения
  global_work_size[0] = num_entries;
  local_work_size[0] = 64;
  clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

Непосредственные вычисления (основаны на отчете «Fitting FFT onto the G80 Architecture»)[12]:

  // Данный код вычисляет FFT длины 1024, путём разбиения на 16, 16 и 4

  __kernel void fft1D_1024 (__global float2 *in, __global float2 *out,
                          __local float *sMemx, __local float *sMemy) {
    int tid = get_local_id(0);
    int blockIdx = get_group_id(0) * 1024 + tid;
    float2 data[16];

    // адрес начала обрабатываемых данных в глобальной памяти
    in = in + blockIdx;  out = out + blockIdx;

    globalLoads(data, in, 64); // coalesced global reads
    fftRadix16Pass(data);      // in-place radix-16 pass
    twiddleFactorMul(data, tid, 1024, 0);

    // локальная перестановка с использованием локальной памяти
    localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
    fftRadix16Pass(data);               // in-place radix-16 pass
    twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication

    localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));

    // 4 вызова БПФ порядка 4
    fftRadix4Pass(data);      // radix-4 function number 1
    fftRadix4Pass(data + 4);  // radix-4 function number 2
    fftRadix4Pass(data + 8);  // radix-4 function number 3
    fftRadix4Pass(data + 12); // radix-4 function number 4

    // coalesced global writes
    globalStores(data, out, 64);
  }

Полноценная реализация БПФ на OpenCL доступна на сайте Apple[13].

Применение

OpenCL находит применение, как одна из реализаций концепции GPU общего назначения, в различном ПО.

  • WinZip v16.5 (2012) от Corel — помимо обновлённого движка для улучшения оптимизации его для многоядерных процессоров, добавлена поддержка OpenCL для GPU AMD (однако, не для Intel и Nvidia) — при этом прирост производительности в этом приложении на APU Trinity и Llano составил до 45 %.[14]

См. также

Напишите отзыв о статье "OpenCL"

Примечания

  1. [www.amd.com/us-en/Corporate/VirtualPressRoom/0,,51_104_543~127451,00.html AMD Drives Adoption of Industry Standards in GPGPU Software Development]. AMD. [www.webcitation.org/66GmGPek8 Архивировано из первоисточника 19 марта 2012].
  2. [www.eweek.com/c/a/Desktops-and-Notebooks/AMD-Backing-OpenCL-and-Microsoft-DirectX-11/ AMD Backs OpenCL, Microsoft DirectX 11]. eWeek. [www.webcitation.org/66GmKFQK7 Архивировано из первоисточника 19 марта 2012].
  3. [www.apple.com/pr/library/2008/06/09snowleopard.html Apple Previews Mac OS X Snow Leopard to Developers]. Apple. [www.webcitation.org/66GmLMR6B Архивировано из первоисточника 19 марта 2012].
  4. Andrew Humber. [www.nvidia.com/object/io_1240224603372.html NVIDIA Releases OpenCL Driver To Developers] (англ.). NVIDIA (20 апреля 2009 года). — Оригинальная новость на официальном сайте NVIDIA Corporation. Проверено 21 апреля 2009. [www.webcitation.org/66GmM7jsd Архивировано из первоисточника 19 марта 2012].
  5. Павел Шубский. [www.igromania.ru/HardwareNews/9112/NVIDIA_otkryla_GPGPU_dlya_razrabotchikov_pod_OpenCL.htm NVIDIA открыла GPGPU для разработчиков под OpenCL](недоступная ссылка — история). Игромания (журнал) (21 апреля 2009 года). Проверено 21 апреля 2009. [web.archive.org/20090425035316/www.igromania.ru/HardwareNews/9112/NVIDIA_otkryla_GPGPU_dlya_razrabotchikov_pod_OpenCL.htm Архивировано из первоисточника 25 апреля 2009].
  6. Сергей и Марина Бондаренко. [www.3dnews.ru/software-news/draiver_opencl_dlya_razrabotchikov_ot_nvidia/ Драйвер OpenCL для разработчиков от NVIDIA]. 3DNews (21 апреля 2009 года). Проверено 21 апреля 2009.
  7. [www.khronos.org/news/press/khronos-releases-opencl-2.0 Khronos Releases OpenCL 2.0] (англ.). khronos.org (22 июля 2013 года). Проверено 22 июля 2013.
  8. [www.khronos.org/news/press/khronos-finalizes-opencl-2.0-specification-for-heterogeneous-computing Khronos Finalizes OpenCL 2.0 Specification for Heterogeneous Computing] (англ.), Khronos Group (18 November 2013). Проверено 20 ноября 2013.
  9. 1 2 3 [www.opennet.ru/opennews/art.shtml?num=31085 Для WebKit представлена реализация технологии WebCL] (рус.). opennet.ru (4 июля 2011 года). Проверено 31 октября 2011. [www.webcitation.org/66GmQttGS Архивировано из первоисточника 19 марта 2012].
  10. 1 2 AMD. Introduction to OpenCL Programming 201005, page 89-90
  11. [s08.idav.ucdavis.edu/munshi-opencl.pdf OpenCL]. SIGGRAPH2008 (14 августа 2008). Проверено 14 августа 2008. [www.webcitation.org/66GmScoh5 Архивировано из первоисточника 19 марта 2012].
  12. [www.cs.berkeley.edu/~kubitron/courses/cs258-S08/projects/reports/project6_report.pdf Fitting FFT onto G80 Architecture] (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report (May 2008). Проверено 14 ноября 2008. [www.webcitation.org/66GmTA1HM Архивировано из первоисточника 19 марта 2012].
  13. . [developer.apple.com/mac/library/samplecode/OpenCL_FFT/index.html OpenCL on FFT]. Apple (16 Nov 2009). Проверено 7 декабря 2009.
  14. [www.thg.ru/cpu/obzor_amd_apu_trinity_a10_a8_a6_test/print.html AMD Trinity: тесты — OpenCL] // THG

Литература

  • Aaftab Munshi; Benedict R. Gaster; Timothy G. Mattson; James Fung; Dan Ginsburg. OpenCL Programming Guide. — Addison-Wesley Professional, 2011. — 648 p. — ISBN 978-0-321-74964-2.

Ссылки

  • [www.khronos.org/opencl/ www.khronos.org/opencl] Официальная страница стандарта (eng.)
  • [www.macworld.com/article/134858/2008/08/snowleopard_opencl.html «OpenCL: What you need to know»], MacWorld, август 2008
  • [opencl.ru/ OpenCL Русскоязычный сайт]
  • Редакция THG. [www.thg.ru/graphic/obzor_opencl/onepage.html OpenCl: приложения с ускоренной постобработкой] (рус.). Tom's Hardware (18 апреля 2012 года). Проверено 24 апреля 2012. [www.webcitation.org/67gJat1Bn Архивировано из первоисточника 15 мая 2012].
  • [developer.amd.com/tools-and-sdks/heterogeneous-computing/amd-accelerated-parallel-processing-app-sdk AMD OpenCL SDK]
  • [developer.nvidia.com/opencl Nvidia OpenCL Samples]
  • [software.intel.com/en-us/vcsource/tools/opencl-sdk Intel OpenCL SDK]

Отрывок, характеризующий OpenCL

– Ты об чем думал теперь, Николенька? – спросила Наташа. – Они любили это спрашивать друг у друга.
– Я? – сказал Николай вспоминая; – вот видишь ли, сначала я думал, что Ругай, красный кобель, похож на дядюшку и что ежели бы он был человек, то он дядюшку всё бы еще держал у себя, ежели не за скачку, так за лады, всё бы держал. Как он ладен, дядюшка! Не правда ли? – Ну а ты?
– Я? Постой, постой. Да, я думала сначала, что вот мы едем и думаем, что мы едем домой, а мы Бог знает куда едем в этой темноте и вдруг приедем и увидим, что мы не в Отрадном, а в волшебном царстве. А потом еще я думала… Нет, ничего больше.
– Знаю, верно про него думала, – сказал Николай улыбаясь, как узнала Наташа по звуку его голоса.
– Нет, – отвечала Наташа, хотя действительно она вместе с тем думала и про князя Андрея, и про то, как бы ему понравился дядюшка. – А еще я всё повторяю, всю дорогу повторяю: как Анисьюшка хорошо выступала, хорошо… – сказала Наташа. И Николай услыхал ее звонкий, беспричинный, счастливый смех.
– А знаешь, – вдруг сказала она, – я знаю, что никогда уже я не буду так счастлива, спокойна, как теперь.
– Вот вздор, глупости, вранье – сказал Николай и подумал: «Что за прелесть эта моя Наташа! Такого другого друга у меня нет и не будет. Зачем ей выходить замуж, всё бы с ней ездили!»
«Экая прелесть этот Николай!» думала Наташа. – А! еще огонь в гостиной, – сказала она, указывая на окна дома, красиво блестевшие в мокрой, бархатной темноте ночи.


Граф Илья Андреич вышел из предводителей, потому что эта должность была сопряжена с слишком большими расходами. Но дела его всё не поправлялись. Часто Наташа и Николай видели тайные, беспокойные переговоры родителей и слышали толки о продаже богатого, родового Ростовского дома и подмосковной. Без предводительства не нужно было иметь такого большого приема, и отрадненская жизнь велась тише, чем в прежние годы; но огромный дом и флигеля всё таки были полны народом, за стол всё так же садилось больше человек. Всё это были свои, обжившиеся в доме люди, почти члены семейства или такие, которые, казалось, необходимо должны были жить в доме графа. Таковы были Диммлер – музыкант с женой, Иогель – танцовальный учитель с семейством, старушка барышня Белова, жившая в доме, и еще многие другие: учителя Пети, бывшая гувернантка барышень и просто люди, которым лучше или выгоднее было жить у графа, чем дома. Не было такого большого приезда как прежде, но ход жизни велся тот же, без которого не могли граф с графиней представить себе жизни. Та же была, еще увеличенная Николаем, охота, те же 50 лошадей и 15 кучеров на конюшне, те же дорогие подарки в именины, и торжественные на весь уезд обеды; те же графские висты и бостоны, за которыми он, распуская всем на вид карты, давал себя каждый день на сотни обыгрывать соседям, смотревшим на право составлять партию графа Ильи Андреича, как на самую выгодную аренду.
Граф, как в огромных тенетах, ходил в своих делах, стараясь не верить тому, что он запутался и с каждым шагом всё более и более запутываясь и чувствуя себя не в силах ни разорвать сети, опутавшие его, ни осторожно, терпеливо приняться распутывать их. Графиня любящим сердцем чувствовала, что дети ее разоряются, что граф не виноват, что он не может быть не таким, каким он есть, что он сам страдает (хотя и скрывает это) от сознания своего и детского разорения, и искала средств помочь делу. С ее женской точки зрения представлялось только одно средство – женитьба Николая на богатой невесте. Она чувствовала, что это была последняя надежда, и что если Николай откажется от партии, которую она нашла ему, надо будет навсегда проститься с возможностью поправить дела. Партия эта была Жюли Карагина, дочь прекрасных, добродетельных матери и отца, с детства известная Ростовым, и теперь богатая невеста по случаю смерти последнего из ее братьев.
Графиня писала прямо к Карагиной в Москву, предлагая ей брак ее дочери с своим сыном и получила от нее благоприятный ответ. Карагина отвечала, что она с своей стороны согласна, что всё будет зависеть от склонности ее дочери. Карагина приглашала Николая приехать в Москву.
Несколько раз, со слезами на глазах, графиня говорила сыну, что теперь, когда обе дочери ее пристроены – ее единственное желание состоит в том, чтобы видеть его женатым. Она говорила, что легла бы в гроб спокойной, ежели бы это было. Потом говорила, что у нее есть прекрасная девушка на примете и выпытывала его мнение о женитьбе.
В других разговорах она хвалила Жюли и советовала Николаю съездить в Москву на праздники повеселиться. Николай догадывался к чему клонились разговоры его матери, и в один из таких разговоров вызвал ее на полную откровенность. Она высказала ему, что вся надежда поправления дел основана теперь на его женитьбе на Карагиной.
– Что ж, если бы я любил девушку без состояния, неужели вы потребовали бы, maman, чтобы я пожертвовал чувством и честью для состояния? – спросил он у матери, не понимая жестокости своего вопроса и желая только выказать свое благородство.
– Нет, ты меня не понял, – сказала мать, не зная, как оправдаться. – Ты меня не понял, Николинька. Я желаю твоего счастья, – прибавила она и почувствовала, что она говорит неправду, что она запуталась. – Она заплакала.
– Маменька, не плачьте, а только скажите мне, что вы этого хотите, и вы знаете, что я всю жизнь свою, всё отдам для того, чтобы вы были спокойны, – сказал Николай. Я всем пожертвую для вас, даже своим чувством.
Но графиня не так хотела поставить вопрос: она не хотела жертвы от своего сына, она сама бы хотела жертвовать ему.
– Нет, ты меня не понял, не будем говорить, – сказала она, утирая слезы.
«Да, может быть, я и люблю бедную девушку, говорил сам себе Николай, что ж, мне пожертвовать чувством и честью для состояния? Удивляюсь, как маменька могла мне сказать это. Оттого что Соня бедна, то я и не могу любить ее, думал он, – не могу отвечать на ее верную, преданную любовь. А уж наверное с ней я буду счастливее, чем с какой нибудь куклой Жюли. Пожертвовать своим чувством я всегда могу для блага своих родных, говорил он сам себе, но приказывать своему чувству я не могу. Ежели я люблю Соню, то чувство мое сильнее и выше всего для меня».
Николай не поехал в Москву, графиня не возобновляла с ним разговора о женитьбе и с грустью, а иногда и озлоблением видела признаки всё большего и большего сближения между своим сыном и бесприданной Соней. Она упрекала себя за то, но не могла не ворчать, не придираться к Соне, часто без причины останавливая ее, называя ее «вы», и «моя милая». Более всего добрая графиня за то и сердилась на Соню, что эта бедная, черноглазая племянница была так кротка, так добра, так преданно благодарна своим благодетелям, и так верно, неизменно, с самоотвержением влюблена в Николая, что нельзя было ни в чем упрекнуть ее.
Николай доживал у родных свой срок отпуска. От жениха князя Андрея получено было 4 е письмо, из Рима, в котором он писал, что он уже давно бы был на пути в Россию, ежели бы неожиданно в теплом климате не открылась его рана, что заставляет его отложить свой отъезд до начала будущего года. Наташа была так же влюблена в своего жениха, так же успокоена этой любовью и так же восприимчива ко всем радостям жизни; но в конце четвертого месяца разлуки с ним, на нее начинали находить минуты грусти, против которой она не могла бороться. Ей жалко было самое себя, жалко было, что она так даром, ни для кого, пропадала всё это время, в продолжение которого она чувствовала себя столь способной любить и быть любимой.
В доме Ростовых было невесело.


Пришли святки, и кроме парадной обедни, кроме торжественных и скучных поздравлений соседей и дворовых, кроме на всех надетых новых платьев, не было ничего особенного, ознаменовывающего святки, а в безветренном 20 ти градусном морозе, в ярком ослепляющем солнце днем и в звездном зимнем свете ночью, чувствовалась потребность какого нибудь ознаменования этого времени.
На третий день праздника после обеда все домашние разошлись по своим комнатам. Было самое скучное время дня. Николай, ездивший утром к соседям, заснул в диванной. Старый граф отдыхал в своем кабинете. В гостиной за круглым столом сидела Соня, срисовывая узор. Графиня раскладывала карты. Настасья Ивановна шут с печальным лицом сидел у окна с двумя старушками. Наташа вошла в комнату, подошла к Соне, посмотрела, что она делает, потом подошла к матери и молча остановилась.
– Что ты ходишь, как бесприютная? – сказала ей мать. – Что тебе надо?
– Его мне надо… сейчас, сию минуту мне его надо, – сказала Наташа, блестя глазами и не улыбаясь. – Графиня подняла голову и пристально посмотрела на дочь.
– Не смотрите на меня. Мама, не смотрите, я сейчас заплачу.
– Садись, посиди со мной, – сказала графиня.
– Мама, мне его надо. За что я так пропадаю, мама?… – Голос ее оборвался, слезы брызнули из глаз, и она, чтобы скрыть их, быстро повернулась и вышла из комнаты. Она вышла в диванную, постояла, подумала и пошла в девичью. Там старая горничная ворчала на молодую девушку, запыхавшуюся, с холода прибежавшую с дворни.
– Будет играть то, – говорила старуха. – На всё время есть.
– Пусти ее, Кондратьевна, – сказала Наташа. – Иди, Мавруша, иди.
И отпустив Маврушу, Наташа через залу пошла в переднюю. Старик и два молодые лакея играли в карты. Они прервали игру и встали при входе барышни. «Что бы мне с ними сделать?» подумала Наташа. – Да, Никита, сходи пожалуста… куда бы мне его послать? – Да, сходи на дворню и принеси пожалуста петуха; да, а ты, Миша, принеси овса.
– Немного овса прикажете? – весело и охотно сказал Миша.
– Иди, иди скорее, – подтвердил старик.
– Федор, а ты мелу мне достань.
Проходя мимо буфета, она велела подавать самовар, хотя это было вовсе не время.
Буфетчик Фока был самый сердитый человек из всего дома. Наташа над ним любила пробовать свою власть. Он не поверил ей и пошел спросить, правда ли?
– Уж эта барышня! – сказал Фока, притворно хмурясь на Наташу.
Никто в доме не рассылал столько людей и не давал им столько работы, как Наташа. Она не могла равнодушно видеть людей, чтобы не послать их куда нибудь. Она как будто пробовала, не рассердится ли, не надуется ли на нее кто из них, но ничьих приказаний люди не любили так исполнять, как Наташиных. «Что бы мне сделать? Куда бы мне пойти?» думала Наташа, медленно идя по коридору.
– Настасья Ивановна, что от меня родится? – спросила она шута, который в своей куцавейке шел навстречу ей.
– От тебя блохи, стрекозы, кузнецы, – отвечал шут.
– Боже мой, Боже мой, всё одно и то же. Ах, куда бы мне деваться? Что бы мне с собой сделать? – И она быстро, застучав ногами, побежала по лестнице к Фогелю, который с женой жил в верхнем этаже. У Фогеля сидели две гувернантки, на столе стояли тарелки с изюмом, грецкими и миндальными орехами. Гувернантки разговаривали о том, где дешевле жить, в Москве или в Одессе. Наташа присела, послушала их разговор с серьезным задумчивым лицом и встала. – Остров Мадагаскар, – проговорила она. – Ма да гас кар, – повторила она отчетливо каждый слог и не отвечая на вопросы m me Schoss о том, что она говорит, вышла из комнаты. Петя, брат ее, был тоже наверху: он с своим дядькой устраивал фейерверк, который намеревался пустить ночью. – Петя! Петька! – закричала она ему, – вези меня вниз. с – Петя подбежал к ней и подставил спину. Она вскочила на него, обхватив его шею руками и он подпрыгивая побежал с ней. – Нет не надо – остров Мадагаскар, – проговорила она и, соскочив с него, пошла вниз.
Как будто обойдя свое царство, испытав свою власть и убедившись, что все покорны, но что всё таки скучно, Наташа пошла в залу, взяла гитару, села в темный угол за шкапчик и стала в басу перебирать струны, выделывая фразу, которую она запомнила из одной оперы, слышанной в Петербурге вместе с князем Андреем. Для посторонних слушателей у ней на гитаре выходило что то, не имевшее никакого смысла, но в ее воображении из за этих звуков воскресал целый ряд воспоминаний. Она сидела за шкапчиком, устремив глаза на полосу света, падавшую из буфетной двери, слушала себя и вспоминала. Она находилась в состоянии воспоминания.
Соня прошла в буфет с рюмкой через залу. Наташа взглянула на нее, на щель в буфетной двери и ей показалось, что она вспоминает то, что из буфетной двери в щель падал свет и что Соня прошла с рюмкой. «Да и это было точь в точь также», подумала Наташа. – Соня, что это? – крикнула Наташа, перебирая пальцами на толстой струне.
– Ах, ты тут! – вздрогнув, сказала Соня, подошла и прислушалась. – Не знаю. Буря? – сказала она робко, боясь ошибиться.
«Ну вот точно так же она вздрогнула, точно так же подошла и робко улыбнулась тогда, когда это уж было», подумала Наташа, «и точно так же… я подумала, что в ней чего то недостает».