jose

Гид по параллельному программированию с использованием MPI

1.     Подготовка

Для параллельного программирования с использованием MPI (Message Passing Interface) необходимо, в первую очередь, желание. Поэтому соберитесь с силами и готовьтесь к трудностям (если, конечно, они у вас возникнут. А у большинства, скорее всего, таки возникнут). С другой стороны, то, что на первый взгляд кажется запутанным и непонятным, после вдумчивого рассмотрения оказывается достаточно тривиальным.
А теперь непосредственно о программировании. Для начала вам необходимо обзавестись:
  1. Собственно, библиотекой MPI;
  2. Компилятором, поддерживающим эту библиотеку.
По первому пункту пользователям Windows (коим, каюсь, являюсь и я) можно выбрать из нескольких вариантов: либо скачать пакет MPICH2 (он, вообще говоря, доступен не только для платформы Windows), либо использовать майкрософтовский пакет msmpi. Поскольку по неизвестным мне причинам MPICH2 отказался у меня нормально работать, то я использовал второй вариант, который, к счастью, не вызвал никаких проблем.
Что же касается компилятора, то тут, пожалуй, наилучшим вариантом (опять таки, говоря о Windows) будет MS Visual Studio (это, конечно, не компилятор, а среда разработки, но в ней компилятор, естественно, имеется). Для того, чтобы в вашем проекте программы заработал MPI нужно, во-первых, подключить библиотеку директивой include (C/C++), а во-вторых, задать специфические настройки проекта (тут я о них упоминать не буду ввиду наличия подобной информации во многих других источниках). Если вкратце, то в настройках нужно везде подобавлять директории с установленными заголовочными файлами и библиотеками MPI.

 

2.     Анализ задачи


Если вы всё установили и настроили, и при этом у вас даже заработал примитивный тестовый пример с первого раза, считайте, что вам уже повезло. Можете даже немного расслабиться. Но ненадолго, так как впереди ещё решение поставленной задачи и её распараллеливание.
Лучше всего рассматривать решение задачи на конкретном примере. Причём, пример должен быть не слишком простым, так как элементарных примеров и так полно в интернете. Итак, предположим, что нам нужно решить уравнение теплопроводности и ускорить решение с использованием параллельного алгоритма. В общем виде уравнение записывается следующим образом:

где k, c, d – коэффициенты, которые могут в общем случае зависеть от времени и координаты; F – функция источника (также может зависеть от времени и координаты).
Чтобы немного упростить себе жизнь, рассмотрим одномерный случай. При этом пусть с=0, k и F – константы,  а на границах отрезка начальные значения нулевые. Тогда получаем следующее уравнение:

Обращаясь к теории численных методов, записываем решение этого уравнения (явная схема):

Или же, в другом виде:

Что можно почерпнуть из этого уравнения с точки зрения программирования? Во-первых, в нём присутствуют значения функции в двух моментах времени: прошлом и текущем. Во-вторых, необходимо хранить значения u в разных точках пространства (прямой). Итак, нам нужны 2 массива длины, равной размерности пространства. Первый – для прошлого момента времени, второй – для текущего. Обозначим их U_old и U_new соответственно. Тогда их объявление и инициализация на языке С++ следующие:

double *U_old, *U_new;
int DIM=sizeX+1;
U_old=new double [DIM];
U_new=new double [DIM];
for(int i=0;i<sizeX+1;i++){      
       U_old[i]=0;
       U_new[i]=0;
}

 
Источник поместим в одну точку пространства (середина отрезка) и далее о нём больше вспоминать не будем:

U_old[sizeX/2]=F; //F==1000
 
Помимо вышесказанного, необходимо также параметризовать в коде программы значения констант уравнения и вычислить значения интервалов dx, dt:

int tmax=1, xmax=1;
int sizeT=10, sizeX=8;
double K=0.01, D=0.4, F=1000;
double dt=(double)tmax/sizeT, dx=(double)xmax/sizeX;

 
Далее вспомним, что в вычислениях нам нужно делить на dx2. Как известно, эта операция очень медленная, а значение dx при этом не меняется (не зависит от времени). Тогда уместно будет посчитать величину 1/dx2 заранее и потом не делить, а умножать на данное значение:

double dx2inv=1/(dx*dx);
 
С учётом всех замечаний, последовательный алгоритм решения одномерного уравнения теплопроводности имеет вид:

#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int main(int argc,char *argv[])
{
//Variables' initialization
    int tmax=1, xmax=1;
    int sizeT=10, sizeX=8;
    double K=0.01, D=0.4, F=1000;
    double dt=(double)tmax/sizeT, dx=(double)xmax/sizeX;
    double dx2inv=1/(dx*dx);
    double *U_old, *U_new;
    int DIM=sizeX+1;
    U_old=new double [DIM];
    U_new=new double [DIM];
    for(int i=0;i<sizeX+1;i++){  
       U_old[i]=0;
       U_new[i]=0;
    }
//Source:
    U_old[sizeX/2]=F;
 
//Process time evolution
    for(int t=1;t<=sizeT;t++){
       for(int i=0;i<DIM;i++){
         U_new[i]=(K*(U_old[i+1]-2*U_old[i]+U_old[i-1])*dx2inv+D*U_old[i])*dt+U_old[i];
       }
       for(int i=0;i<DIM;i++){
             U_old[i]=U_new[i];
       }
    }
//Printing to file
    ofstream ofs("results.txt");
    if(!ofs){cout << "Error!"; exit;}
    for(int i=0;i<DIM;i++){
       ofs << U_old[i] << " ";
    }
    ofs.close();
//----------------------------------------------
    cin.get();
    return 0;
}

 
3.     Разработка параллельного алгоритма

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

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Finalize();
 

Первая и последняя функции инициализируют и завершают работу MPI, и являются обязательными для использования этого интерфейса. А вот без остальных двух функций просто нельзя обойтись. Они записывают в переменные numprocs и myid значения количества доступных процессоров (потоков) и идентификатор каждого процессора (потока). К примеру, в однопоточной системе numprocs=1, а myid=0.
Вернёмся теперь к разработанному нами последовательному алгоритму решения уравнения. Очевидно, что в нём самой сложной с точки зрения вычислений частью является следующий цикл:

    for(int t=1;t<=sizeT;t++){
       for(int i=0;i<DIM;i++){
         U_new[i]=(K*(U_old[i+1]-2*U_old[i]+U_old[i-1])*dx2inv+D*U_old[i])*dt+U_old[i];
       }
       for(int i=0;i<DIM;i++){
             U_old[i]=U_new[i];
       }
    }

 
Именно этот цикл мы и будем распараллеливать, то есть равномерно распределять вычисления между доступными в системе процессорами. Из-за того, что текущее значение функции сильно зависит от прошлого, распараллеливать по времени нет смысла: чтобы посчитать следующий шаг, нас необходимо дождаться расчёта предыдущего. Поэтому будем как-то распределять по процессорам итерации цикла по пространственной координате. Для этого достаточно поделить отрезок х на numprocs интервалов и, что самое главное, обеспечить обмен между потоками посчитанными значениями на границах:


Для начала, зададим границы интервалов для каждого потока с идентификатором myid:

int piece=sizeX/numprocs; //размер части отрезка
int lbound, rbound; //левая и правая границы отрезка
lbound=myid*piece+1;
rbound=lbound+piece-1;
if(myid==numprocs-1 && sizeX%2==0) rbound--;

 
Необходимость последней строчки легко проверить на примере. Пусть sizeX=8, numprocs=1; тогда piece=8, lbound=1, rbound=8-1=7 (в точках 0 и 8 мы не можем считать значения функции, так как это границы отрезка).
Теперь важно понять, когда, где и как организовать обмен сообщениями между потоками, в которых они бы сообщали значения на границах своих интервалов. Параллельную работу с обменом сообщениями можно организовать следующим образом:
  1. сначала начинает работать поток 0 (myid=0). Посчитав значения функции на всём своём интервале, он передаёт потоку 1 сообщение со значением функции в своей правой границе;
  2. поток 1 получает сообщение от потока 0, благодаря чему может посчитать значение в своей левой границе; затем он вычисляет оставшиеся значения и отправляет 2 сообщения: потоку 0 – значение функции в левой границе, а потоку 2 – в правой и т.д. до тех пор, пока потоками не будут посчитаны значения функции на всём отрезке;
  3. повторение первых 2 пунктов для следующего момента времени.
В коде программы это выглядит следующим образом:

MPI_Status status; //переменная, в которую будет записан статус обмена
for(int t=1;t<=sizeT;t++){
  //Приём сообщений-------------------------------------------------------
  if(myid>0)MPI_Recv(&U_new[lbound-1],1,MPI_DOUBLE,myid-1,1,MPI_COMM_WORLD,&status);
  if(t>1 && myid<numprocs-1)MPI_Recv(&U_new[rbound+1],1,MPI_DOUBLE,myid+1,2,
                                     MPI_COMM_WORLD,&status);
  //-------------------------------------------------------------------------
  for(int i=lbound;i<=rbound;i++){
    U_new[i]=(K*(U_old[i+1]-2*U_old[i]+U_old[i-1])*dx2inv+D*U_old[i])*dt+U_old[i];
  }
  for(int i=lbound-1;i<=rbound+1;i++){
    U_old[i]=U_new[i];
  }
  //Передача сообщений--------------------------------------------------------
  if(myid<numprocs-1)MPI_Ssend(&U_new[rbound],1,MPI_DOUBLE,myid+1,1,MPI_COMM_WORLD);
  if(t<sizeT && myid>0)MPI_Ssend(&U_new[lbound],1,MPI_DOUBLE,myid-1,2,MPI_COMM_WORLD);
  //-------------------------------------------------------------------------------------
}


Пожалуй, каждая строчка с приёмом/передачей сообщения требует отдельного комментария.

if(myid>0)MPI_Recv(&U_new[lbound-1],1,MPI_DOUBLE,myid-1,1,MPI_COMM_WORLD,&status);

Если myid>0, то активируем приём сообщения от потока с идентификатором myid-1 и тегом 1 (то есть, будут приниматься сообщения только с тегом 1). Статус обмена будет записан в объявленную ранее переменную status. Это необходимо для использования функции приёма сообщения. Значение функции U, переданное в этом сообщении, записывается в массив U_new на 1 позицию «левее» текущей левой границы интервала.

if(t>1 && myid<numprocs-1)MPI_Recv(&U_new[rbound+1],1,MPI_DOUBLE,myid+1,2,  MPI_COMM_WORLD,&status);
                                                                          
На всех временных итерациях, кроме первой, и для потока с myid<numprocs-1 (не последний поток) активируем приём сообщения от потока myid+1 с тегом 2. Записываем переданное в сообщении значение в массив U_new на 1 позицию «правее» текущей правой границы интервала.

if(myid<numprocs-1)MPI_Ssend(&U_new[rbound],1,MPI_DOUBLE,myid+1,1,MPI_COMM_WORLD);
 
Всем потокам, кроме последнего, активировать синхронную передачу сообщения (Ssend) потоку myid+1 с тегом 1. В сообщении передать значение в массиве U_new в правой границе интервала. Синхронная передача сообщения используется потому, что нам существенно, в каком порядке потоки начинают работать над расчётами. О разновидностях использованного нами двухточечного обмена можно (и желательно) почитать в других источниках.

if(t<sizeT && myid>0)MPI_Ssend(&U_new[lbound],1,MPI_DOUBLE,myid-1,2,MPI_COMM_WORLD);

Если момент времени не последний, то потокам с идентификатором myid>0 активировать синхронную передачу сообщения потоку myid-1 с тегом 2. В сообщении передаётся значение в массиве U_new в левой границе интервала.
Теперь все значения посчитаны, но хранятся они в разных потоках. Поэтому надо на какой-то из потоков возложить роль сборщика данных. Пусть это будет поток 0. Тогда он будет принимать от всех остальных потоков значения функции на их интервалах:
 
if(myid>0)MPI_Send(&U_new[lbound],piece,MPI_DOUBLE,0,3,MPI_COMM_WORLD);
if(myid==0){
  for(int i=1;i<numprocs;i++){
       MPI_Recv(&U_old[i*piece+1],piece,MPI_DOUBLE,i,3,MPI_COMM_WORLD,&status);
  }
}

 
Последний штрих в коде нашей программы – это подсчёт времени работы алгоритма. Ведь мы, собственно, столько мучились с распараллеливанием ради ускорения работы. Для этого можно воспользоваться функцией MPI_Wtime():

double startwtime = 0.0, endwtime;
startwtime = MPI_Wtime();
//цикл с параллельными вычислениями
endwtime = MPI_Wtime();
cout << "Time: " << endwtime-startwtime << " sec" << endl;

 
Код получившейся программы:

#include <mpi.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int main(int argc,char *argv[])
{
    int myid, numprocs;
    MPI_Status status;
    double startwtime = 0.0, endwtime;
    int  namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
 
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Get_processor_name(processor_name,&namelen);
 
    //----------------------------------------------
    //Variables' initialization
    int tmax=1, xmax=1;
    int sizeT=10, sizeX=8;
    double K=0.01, D=0.4, F=1000;
    double dt=(double)tmax/sizeT, dx=(double)xmax/sizeX;
    double dx2inv=1/(dx*dx);
    double *U_old, *U_new;
    int DIM=sizeX+1;
    U_old=new double [DIM];
    U_new=new double [DIM];
    for(int i=0;i<sizeX+1;i++){  
       U_old[i]=0;
       U_new[i]=0;
    }
    //Source:
    U_old[sizeX/2]=F;
    //----------------------------------------------
    //Computational pieces for processors and their boundaries
    int piece=sizeX/numprocs;
    int lbound, rbound;
    if(myid==0)lbound=myid*piece+1;
    else lbound=myid*piece+1;
    rbound=lbound+piece-1;
    if(myid==numprocs-1 && sizeX%2==0) rbound--;
    //----------------------------------------------
    //Process time evolution
    if(myid==0){
       cout << "Computational process started..." << endl;
       startwtime = MPI_Wtime();
       cout << "Iteration:" << endl;
    }
    for(int t=1;t<=sizeT;t++){
       //Messages' exchange-------------------------------------------------------------
       if(myid>0)MPI_Recv(&U_new[lbound-1],1,MPI_DOUBLE,myid-1,1,MPI_COMM_WORLD,&status);
       if(t>1 && myid<numprocs-1)MPI_Recv(&U_new[rbound+1],1,MPI_DOUBLE,myid+1,2,
                                          MPI_COMM_WORLD,&status);
       //-------------------------------------------------------------------------------
       for(int i=lbound;i<=rbound;i++){
           U_new[i]=(K*(U_old[i+1]-2*U_old[i]+U_old[i-1])*dx2inv+D*U_old[i])*dt+U_old[i];
       }
       for(int i=lbound-1;i<=rbound+1;i++){
           U_old[i]=U_new[i];
       }
       //Messages' exchange--------------------------------------------------------------
       if(myid<numprocs-1)MPI_Ssend(&U_new[rbound],1,MPI_DOUBLE,myid+1,1,MPI_COMM_WORLD);
       if(t<sizeT && myid>0)MPI_Ssend(&U_new[lbound],1,MPI_DOUBLE,myid-1,2,
                                      MPI_COMM_WORLD);
       //--------------------------------------------------------------------------------
    }
    if(myid>0)MPI_Send(&U_new[lbound],piece,MPI_DOUBLE,0,3,MPI_COMM_WORLD);
    if(myid==0){
       for(int i=1;i<numprocs;i++){
           MPI_Recv(&U_old[i*piece+1],piece,MPI_DOUBLE,i,3,MPI_COMM_WORLD,&status);
       }
       endwtime = MPI_Wtime();
       //----------------------------------------------
       //Printing to file
       ofstream ofs("results.txt");
       if(!ofs){cout << "Error!"; exit;}
       for(int i=0;i<sizeX+1;i++){
           ofs << U_old[i] << " ";
       }
       ofs.close();
       //----------------------------------------------
       cout << "The end" << endl;
       cout << "Time: " << endwtime-startwtime << " sec" << endl;
       cin.get();
    }
    MPI_Finalize();
    return 0;
}


 
 4.     Запуск программы

Чтобы разработанная нами программа заработала в многопоточном режиме, нужны дополнительные усилия. А точнее, надо запустить командную строку Windows, перейти в каталог установленного MPICH2 или msmpi, в папку bin. У меня полный путь к этой директории выглядит следующим образом:

C:\Program Files\Microsoft HPC Pack 2008 R2\Bin

Далее в командной строке ввести следующую команду:

start mpiexec –n <количество потоков> <полный путь к вашей программе>

К примеру, это может выглядеть так:

start mpiexec –n 4 С:/program.exe

Внимание! Файл с результатами вычислений (results.txt) будет создан в том каталоге, где находится mpiexec, а не ваша программа. То есть, в моём случае, в директории C:\Program Files\Microsoft HPC Pack 2008 R2\Bin

Если у вас всё получилось и программа работает (причём, правильно, причём, быстрее, чем последовательный алгоритм), то я вас поздравляю! Дальнейшее знакомство с MPI  в ваших руках ;)
 
 
 P.S. Надеюсь, кому-то этот гид поможет :)

jose

Концерт группы "Blueneck" в Киеве

20 октября состоялось знаменательное событие - в Киеве выступила британская ambient post-rock группа "Blueneck". Сказать, что концерт удался - это не сказать ничего. Ребята выступили на отличном уровне, выкладывались по полной. И несмотря на довольно меланхоличный тон исполняемых песен, музыканты умудрялись в перерывах между песнями веселить публику, подтрунивая друг над другом и создавая тёплую дружественную атмосферу.
На разогреве сыграл украинский коллектив "Hungry for Hands" (первое фото), которых также следует похвалить как за их музыку, так и за старательность её исполнения. Единственное, что не очень понравилось, так это излишняя громкость звука. Особенно это чувствовалось на первых композициях, когда от высоких частот "перегруженных" электрогитар буквально закладывало уши.



Однако во время игры "Blueneck" (на фото ниже) проблем со звуком я лично не заметил. Как уже было сказано выше, всё было на высоком уровне. "Blueneck" понравились не только с музыкальной, но и с человеческой точки зрения. Ребята несколько раз благодарили за тёплый приём и высказывали своё удовольствие выступать перед украинской публикой. К тому же, не часто можно услышать от зарубежных музыкантов извинения за то, что они не знают нашего языка, это, на мой взгляд, дорогого стоит. В общем, знакомство с "Blueneck" вышло приятным и запоминающимся, и это самое главное. Надеюсь, они ещё не раз посетят нашу столицу :)







И напоследок, подборка ссылок на фотографии и видео:
http://orck.sumno.com/gallery/blueneck-i-hungry-for-hands-v-kyjevi/
http://fadiez.com.ua/gallery/blueneck-vystupyly-v-kyjevi/
http://www.azh.com.ua/music/video/blueneck

Интервью с музыкантами после концерта: http://fadiez.com.ua/article/intervyu-z-gurtom-blueneck/
jose

Фестиваль "Країна мрій"

Побывал в субботу на фестивале "Країна мрій". Было всё: и этнический колорит, и музыка, и народные гулянья, и жара, и проливной дождь. Короче, было весело :) Большую часть времени провёл на площадке Украинско-японского центра (УЯЦ), на которой были разные интересные мастер-классы и выступления. Соответственно, основная часть фоток и видео именно оттуда. Итак, вот они:

дидухРодина-мать
ЛавраГетьман жив!
Народные гулянияУголок УЯЦ
Танцевальный коллектив









jose

Концерт японской императорской музыки Гагаку в исполении коллектива «Отоновакай»

Сегодня побывал на этом концерте. Первое впечатление  - удивление от того, сколько народу пришло в ДК КПИ. Таких народных масс я не видел с тех пор, как... хм... вообще не видел раньше) Когда уже нашёл себе место в зале и расположился, то почти сразу началось представление японского коллектива и затем собственно выступление. Скажу сразу, что я не фанат такой музыки, но мне она показалась необычной, атмосферной и, как сказал мой друг, искренней. В целом выступление оказалось интересным и запоминающимся. Узнал про инструменты, на которых играется музыка Гагаку, которых раньше и не видел даже.

Короче говоря, доволен, что посетил концерт. Спасибо "Отоновакай" за выступление. Приезжайте ещё.
З.Ы. Скоро будут фотки и видео, ожидайте)







 
Faith

Небольшая история "Осенний вечер"

 

Осенний вечер

Осень. Наступает вечер и постепенно на землю опускаются сумерки, окрашивая природу в серые тоскливые тона. Улица пустынна: сырость и холодный ветер разогнали людей по уютным  квартирам, где они, греясь у семейного очага, рассказывают друг другу шутки и делятся эмоциями от ещё одного прожитого дня. На другом конце улицы появился одинокий трамвай. Подъехав поближе, остановился, и из него вышел человек, укрывающийся от непогоды зонтиком и серым длинным плащом. "Неужели это Он, тот единственный, кто нужен мне?"- из глубины души пробился голос надежды, заставляя всё моё тело трепетать и согревая меня изнутри. Уже вот-вот готова была вскрикнуть от радости и неописуемого счастья, но тут порыв ветра выхватил из рук человека зонтик, словно приглашая на головокружительный танец вместе с упавшей листвой, и я увидела его лицо. В груди больно защемило: это не Он. И, словно вторя такому горькому разочарованию, природа зарыдала холодным дождём, завыла пронизывающим ветром. Снова улица опустела. Тяжёлые капли стучат по стеклу, стекают маленькими ручейками, вызывая ещё большую грусть на душе. Но я держусь. Я решила выдержать это испытание судьбы, и я не заплачу, нет. Я вынесу эту боль. Поглощённая такими мыслями, я не заметила, как начал звонить телефон в моей комнате. И лишь после третьего звонка я словно очнулась и медленно подошла к нему.

-Алло -, полным отчаяния, дрожащим, словно осенний лист, голосом сказала я. Секундная тишина, и из трубки послышался знакомый голос.

-Это ты, милая? - внутри всё как будто перевернулось. Не в силах больше скрывать свои эмоции, я заплакала. Но уже не от боли, острой, как лезвие ножа, и тоски, отравляющей душу, а от осознания того, насколько  Он мне дорог и счастья вновь услышать его слова.  - Прости, что так долго не звонил. Мне срочно надо было покинуть город, а телефон мой сломался и позвонить я смог только сейчас. Ты слушаешь? - утирая слёзы, киваю головой, надеясь, что Он поймёт мой бессловесный ответ.

-Выгляни, пожалуйста, в окно, - ничего не понимая, с телефоном в руках похожу к холодному стеклу, за которым по-прежнему льёт дождь в вечерних сумерках. Но теперь  улица не безлюдна. Приглядевшись, в тусклом свете уличных фонарей я увидела Его. В одной руке телефон, в другой букет цветов, которые я так люблю. Заметив меня, Он улыбнулся. Продолжая плакать, я прислоняюсь к стеклу ладонями  и улыбаюсь ему в ответ, понимая, как же, всё-таки, прекрасен этот осенний вечер...

 
jose

Один день зимы

Сегодня выходя из дома прихватил с собой фотик. И не пожалел. Потому что всего за один день я убедился, насколько противоречивыми могут оказаться впечатления от увиденного на улице. Я даже не припомню, когда в последний раз видел столько много снега. Просто таки океан.
А противоречивыми мои впечатления были потому, что с одной стороны зима может быть чертовски красивой, аж дух захватывет, и весёлой, доставляющей снеговиковылепливанием и снегошвырянием (бедняга снеговик был под обстрелом кучи снежек):


 
и, с другой стороны, зима одновременно может быть устрашающей и разрушительной



В общем, день выдался запоминающимся :) Жаль только деревьев, которых так жестоко поломало снегом... 
jose

Открытый творческий вечер "Винни-пух и все-все-все"

 Да...давно я тут ничего не писал. Зато теперь самое время :) И не потому что я поборол лень что-то писать, а исключительно благодаря впечатлениям от посещения открытого творческого вечера "Винни-пух и все-все-все", которыми, собственно, и хочу поделиться. Итак, приступим. Для начала хочу поблагодарить всех участников этого творческого вечера. Понравилось всё: от неавторской до авторской песни, от поэзии до прозы, от танцев до музыкальных композиций, от театральных постановок до фотогалереи. Получил много позитива и замечательных воспоминаний. Если бы мне предложили побывать на таком мероприятии ещё раз, непременно бы согласился. Честно говоря, обидно за тех, кто не побывал в то время в конференц-зале ГК "Турист". Они таки многое потеряли. Отдельно отмечу отличную работу звукорежиссёров. Звук был чистым, достаточно громким и способствовал наслаждению от наблюдения за происходящим на сцене (в чём, безусловно, и большая заслуга самих выступавших :)), что, честно говоря, приятно удивило, так как данное мероприятние было абсолютно юесплатным. И это, конечно, вызывает глубочайшее уважение ко всем организаторам. А чтобы не быть голословным, оставлю тут пару фотографий и видео, и вы сами сможете убедиться в том, что я не соврал =) Изранные фотографии с разных эпизодов вечера:

- Собственно, вот и виновник торжества



- Вот такие современные поэты =) Граждане, берите пример! И не забудьте спросить у этого человека, как нужно правильно проводить свободное время =) (особенно тем, кто вообще не знает, что такое свинг и с чем его едят)



- А вот ещё один яркий пример многогранной творческой личности:



- Музыкальный дуэт двух талантливых девушек с красивой и трогательной авторской песней:



- А тут уже целая музыкальная программа с исполнением музыкальных произведений в стиле барокко, барокко-джаз и джаз:

 

- Видео с другими тремя участниками, как по мне, говорят сами за себя:








Ну, и напоследок хочу сказать, что в этом кратком фотообзоре вы видели только малую часть того, что на самом деле происходило на том замечательном вечере. Было ещё много талантливых участников и очень интересных выступлений, которые можно было бы включить в этот отчёт, но всё равно всего не передать. На таких мероприятиях нужно побывать самому.  Чтобы посмотреть больше фотографий (заранее извиняюсь за качсетво снимков), можете скачать мой фотоархив: http://filegetty.com/448660/

А более подробную информацию о вечере можно узнать на сайте pooh2010.kiev.ua/
jose

Второй всеукраинский фестиваль японской анимации в Киеве. Продолжение

Итак, про косплей-шоу я немного рассказал и показал. Теперь настала очередь показать, как проходило костюмированное шествие анимешников по Контрактовой площади =) Ну и, конечно, как же не показать талантливых косплееров, которые, не побоявшись довольно прохладной погоды, всё-таки вышли на шествие и позволили себя пофотографировать ^_^
Я не претендую на звание специалиста по всему аниме, поэтому для некоторых косплееров не буду указывать название аниме и имя персонажей, которых они изображали, так как просто не знаю =) Надеюсь, вы меня простите за это. Далее лучшие фото из моей коллекции:

Флаг харьковского аниме-клуба, который служил ориентиром для толпы анимешников, учавствующих в шествии:
 


Не знаю, кого косплеят, но мило :) (крайняя левая - это Аманэ Миса из аниме Death Note; крайняя справа девочка, вроде, косплеит кого-то из Наруто, да простят меня нарутоманы за незнание) :

 


Ещё немного незнакомого мне косплея, но при этом красивого (нека справа обалдеть!):

 


Далее встречаем персонажей из аниме Ergo Proxy (Винсент) и Hellsing (Леди Интегра Вингейтс Хеллсинг) соответственно:

 


Общая фотка группы косплеерш (крайняя справа - Докуро из одноимённого аниме. Левее её сестра Закуро (: ):



Далее Коната из Lucky Star и и Александр Андерсон из Hellsing:

 


Как анимешники по улицам города ходили (и случайная реклама life:) ):

 


Далее настоящее мужское слияние и убийство робота Лаганна из аниме Tengen Toppa Gurren Lagann:

 


Ну, и напоследок, я в компании с прекрасным косплеем:



jose

Второй всеукраинский фестиваль японской анимации в Киеве

На прошлых выходных прошёл замечательный фестиваль японской анимации. Несмотря на все оплошности организации, считаю, что фестиваль таки удался. Хотя не мне судить, конечно, а самим организаторам. Получил много позитивных эмоций не только от пребывания на субботнем косплей-шоу, но и от фотографирования косплееров на воскресном шествии. Решил подготовить небольшую фотогалерею по этому поводу со своими краткими комментариями.
Для начала, пару фоток с косплей-шоу:
 


На данном фото представлен общий вид концертного зала Киево-Могилянской академии. Далее можно увидеть выступление музыкального коллектива Cantabile:
 


Коллектив ведущих вестиваля во главе с прекрасной Усаги, косплеющих персонажей аниме Tnegen Toppa Gurren Lagann:
 


А вот и сама Усаги (usagi_rnd) во всй красе =) :
 


Далее ещё много чего было интересного на сцене, но под конец у меня разрядился аккумулятор и нанимать не получилось =( Да и позиция для фотографирования была откровенно неудачная, так что с субботнего вечера могу показать ещё только пару более ли менее качественных фоток косплееров:
 



Ну вот, в принципе, и всё, что я хотел показать/рассказать по поводу субботнего косплй-шоу. Про шествие, пожалуй, расскажу в следующей статье. Так что до встречи! ^_^

Потихоньку начинаю выкладывать фотки с косплей-шоу на файлообменники: 
часть 1 - http://filestore.com.ua/?d=8449DB8D4
часть 2 - http://filestore.com.ua/?d=54D576B54
часть 3 - http://filestore.com.ua/?d=C7113D3B4

И немного видео: