Лекция: TOP500 суперкомпьютеров: "Туманность" готова поглотить "Ягуара"...
Функция DisconnectNamedPipeотсоединяет экземпляра именованного канала серверной части.
BOOL DisconnectNamedPipe( HANDLEhNamedPipe);
hNamedPipe – дескриптор экземпляра именованного канала. Этот дескриптор (handle) должен быть создан функцией CreateNamedPipe.
GetLastError
Программа «клиент»: Client.cpp:
// Client.cpp: Defines the entry point for the console application.
//
#include «stdafx.h»
#include <windows.h>
#include <stdio.h>
#include <conio.h>
LPSTR lpszPipeName = "\\\\.\\pipe\\simple";
//Два буфера для приема и для передачи
char outbuf[80];
char inbuf[80];
DWORD bytesRead;
int main(int argc, char* argv[])
{
printf(«String 1 sending to server>»);
scanf("%s",outbuf);
BOOL ret = CallNamedPipe(lpszPipeName,
outbuf, sizeof(outbuf),
inbuf, sizeof(inbuf),
&bytesRead, NMPWAIT_WAIT_FOREVER);
if (!ret) {
printf(«client: CallNamedPipe failed, GetLastError = %d\n», GetLastError());
getch();
exit(1);
}
printf("\nclient: received 1\"%s\"\n", inbuf);
printf(«String 2 sending to server>»);
scanf("%s",outbuf);
//для каждой из передач вызываем CallNamedPipe
//
ret = CallNamedPipe(lpszPipeName,
outbuf, sizeof(outbuf),
inbuf, sizeof(inbuf),
&bytesRead, NMPWAIT_WAIT_FOREVER);
if (!ret) {
printf(«client: CallNamedPipe failed, GetLastError = %d\n», GetLastError());
getch();
exit(1);
}
printf("\nclient: received 2\"%s\"\n", inbuf);
getch();
return 0;
}
Server.cpp:
#include «stdafx.h»
#include <windows.h>
#include <stdio.h>
#include <conio.h>
LPSTR lpszPipeName = "\\\\.\\pipe\\simple";
SECURITY_ATTRIBUTES sa;
PSECURITY_DESCRIPTOR pSD = NULL;
HANDLE hPipe = INVALID_HANDLE_VALUE;
OVERLAPPED os;
TCHAR szIn[80];
TCHAR szOut[80];
DWORD cbRead;
DWORD cbWritten;
DWORD dwWait;
HANDLE hEvent = NULL;
BOOL bRet;
int main(int argc, char* argv[])
{
pSD = (PSECURITY_DESCRIPTOR) malloc( SECURITY_DESCRIPTOR_MIN_LENGTH );
if (pSD == NULL)
{
printf(«Failed to malloc SD»);
goto cleanup;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{
printf(«Failed to initialize SD»);
goto cleanup;
}
// add a NULL disc. ACL to the security descriptor.
//
if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE))
{
printf(«Failed to Set SD»);
goto cleanup;
}
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
hPipe = CreateNamedPipe(
lpszPipeName, // имя канала
FILE_FLAG_OVERLAPPED |
PIPE_ACCESS_DUPLEX, // режим открытия канала
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT, // канал типа IO
1, // количество экземпляров
0, // размер outbuf (0 == allocate as necessary)
0, // размер inbuf
1000, // default time-out значение
&sa); // атрибуты безопасности
if (hPipe == INVALID_HANDLE_VALUE) {
printf(«Failed to create named pipe»);
goto cleanup;
}
hEvent = CreateEvent(
NULL, // нет атрибутов безопасности
TRUE, // руководство reset событий
FALSE, // not-signalled
NULL); // no name
if ( hEvent == NULL)
{
printf(«Failed to create event»);
goto cleanup;
}
while ( 1 )
{
// инициализация overlapped-структуры
//
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent);
// ожидание соединения.
//
ConnectNamedPipe(hPipe, &os);
if ( GetLastError() == ERROR_IO_PENDING )
{
dwWait = WaitForMultipleObjects( 1, &hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0) // not overlapped i/o event — error occurred,
break; // or server stop signaled
}
// инициализация overlapped-структуры
//
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent);
// попытка схватить все пришедшее через канал
//
bRet = ReadFile(
hPipe, // файл, от куда читать
szIn, // адрес вводимого буфера
sizeof(szIn), // кол-во байт для чтения
&cbRead, // кол-во считанных байт
&os); // не нужно
if ( !bRet && ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 1, &hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0+1 ) // не overlapped i/o событие — ошибка,
break; // или сервер прекратил сигналы
}
sprintf(szOut, «Server received %s», szIn);
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent );
// отослать обратно
//
bRet = WriteFile(
hPipe, // файл, куда писать (имеется ввиду канал, а не файл)
szOut, // адрес output буфера
sizeof(szOut), // кол-во байт для чтения
&cbWritten, // кол-во записанных байт
&os); // overlapped stuff, not needed
if ( !bRet && ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 1,&hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0 ) // not overlapped i/o event — error occurred,
break; // or server stop signaled
}
// отсоединиться
//
DisconnectNamedPipe(hPipe);
}
cleanup:getch();
return 0;
}
На экране:
Рис.1
TOP500 суперкомпьютеров: «Туманность» готова поглотить «Ягуара»...
01.06.2010 [13:41], Иван Терехов
В рамках открытия Международной суперкомпьютерной конференции ISC`10 в немецком Ганновере, была опубликована новая редакция рейтинга TOP500 самых мощных вычислительных систем. И хотя на этот раз лидер не изменился, в спину ему дышит новичок — потенциальный фаворит. Авторы 35-го списка TOP500 отмечают, что интенсивное развитие суперкомпьютерной отрасли в Китае, речь о котором ведется на протяжении последних лет, начинает давать свои результаты. Впервые за 15 лет, в течение которых составляется рейтинг, КНР смогла в него попасть, причем сразу на второе место.
Суперкомпьютер Nebulae (Туманность), установленный в Национальном суперкомпьютерном центре в Шеньжене по результатам тестирования пакетом Linpack показал производительность на уровне 1,271 петафлопс, оказавшись на втором месте – между Ягуаром (Cray Jaguar – 1,75 петафлопс) и IBM Roadrunner (1,04 петафлопс).
Разработанный китайской компанией Dawning Information Industry, суперкомпьютер состоит из блейд-серверов TC3600, построенных на базе процессоров Intel Xeon 5650 и графических ускорителей NVIDIA Tesla C2050. Создатели заявляют, что возможностей масштабирования архитектуры хватит для достижения показателя в 3 петафлопс, в то время, как нынешний лидер может улучшить результат «всего» до 2,3 петафлопс.
Что касается российских систем, то их количество возросло до 11 машин (в предыдущем списке их было 8), или около 2% всех систем рейтинга. Среди 31 страны Россия занимает 6 место, отставая от США (282 системы), Великобритании (38), Франции (27), Германии и Китая (по 24 на каждую), и Японии (18). Самой мощной системой в России остается суперкомпьютер «Ломоносов», установленный в МГУ. В новой редакции списка он переместился на одну позицию вниз и теперь занимает 13 место. Пиковая производительность машины составляет 414 терафлопс, реальная – 350 терафлопс. Напомним, что в 2011 г. мощность этой системы планируется увеличить до 1 петафлопс.
Статистика рейтинга TOP500 говорит о том, что суммарная мощность всех 500 систем превышает 10 петафлопс. Большинство суперкомпьютеров (81,6%) работают на базе процессоров Intel, доля AMD составила 9,4%. Лидерами среди компаний-производителей являются IBM и Hewlett-Packard, на долю которых приходится 39,8% и 37% суперкомпьютеров соответственно.
В разрезе операционных систем подавляющее большинство принадлежит Linux – 91% (455 машин), на втором месте – Unix 4,4% (22), доля Windows, BSD и прочих ОС в сумме – менее 5 %.