- •Содержание
- •Глава 1. Обзор литературы и постановка задачи 8
- •1.4 Модели программирования 41
- •6.4.10 Мероприятия и средства по защите окружающей среды 103
- •Введение
- •Глава 1. Обзор литературы и постановка задачи
- •1.1 Высокопроизводительные вычисления
- •1.2 Архитектура суперкомпьютеров.
- •1.2.1 Коммуникационные среды.
- •1.2.2 Топология соединительной сети суперкомпьютеров
- •1.2.3 Обзор коммуникационных сред
- •1.3. Программное обеспечение
- •1.3.1 Классификация ос
- •1.3.2Компиляторы
- •1.3.3 Компилятор gnu Compiler Collection
- •1.3.6 Библиотеки для программирования параллельных вычислений.
- •1.3.7 Библиотеки программирования вMpi,cudAиshmem.
- •1.4 Модели программирования
- •1.4.1 Модель передачи сообщенийMpi
- •1.4.2 ТехнологияOpenMp
- •1.4.3 Технология: shmem.
- •1.5 Постановка задачи.
- •Глава 2. Разработка Алгоритма тестирования
- •2.1 Алгоритм теста латентности и коммуникационной производительности.
- •2.2. Блок схема алгоритма
- •Глава 3. Разработка программного обеспечения
- •3.1 Описание и состав суперкомпьютера «эск-е»
- •3.2 Функциональная схема коммуникационной среды.
- •3.3 Основная конфигурацияPci
- •Коммуникационная среда pci Express
- •3.4 Текст программы
- •3.4.1 Объяснение значений параметров тестового по.
- •Глава 4. Экспериментальные исследования
- •Глава 5. Организационно – экономическая часть.
- •5.1. Технико-экономическое обоснование объекта проектирования.
- •5.2. Состав конструкторской группы и их должностные оклады.
- •5.3. Перечень этапов опытно-конструкторских работ при разработке программного обеспечения.
- •5.4. Расчёт сметы затрат на окр при разработке программного обеспечения.
- •5.5. Вывод
- •Глава 6. Безопасность и экологичность проектных решений
- •6.1. Цель и решаемые задачи
- •6.2. Опасные и вредные факторы при работе с пэвм
- •6.3. Характеристика объекта исследования
- •6.4. Мероприятия по безопасности труда и сохранению работоспособности.
- •6.4.1. Обеспечение требований эргономики и технической эстетики
- •6.4.1.1. Планировка помещения и размещение оборудования
- •6.4.1.2. Эргономические решения по организации рабочего места пользователя пэвм
- •6.4.1.3. Цветовое оформление помещения
- •6.4.2. Обеспечение оптимальных параметров воздуха рабочих зон
- •6.4.2.1. Нормирование параметров микроклимата
- •6.4.2.2. Нормирование уровней вредных химических веществ
- •6.4.2.3. Нормирование уровней аэроионизации
- •6.4.3. Создание рационального освещения
- •6.4.4 Защита от шума
- •6.4.5 Обеспечение режимов труда и отдыха
- •6.4.6. Обеспечение электробезопасности
- •6.4.7. Защита от статического электричества
- •6.4.8. Обеспечение допустимых уровней электромагнитных полей
- •6.4.9 Обеспечение пожаробезопасности
- •6.4.9.1 Обеспечение безопасной эвакуации персонала
- •6.4.9.2 Средства извещения и сигнализации о пожаре.
- •6.4.9.3 Способы и средства тушения пожара
- •Пути снижения выбросов и токсичности: стимулом к сокращению объёмов предполагается заинтересованность в сокращении расхода топлива.
- •6.4.10.1 Утилизация компьютеров и оргтехники
- •6.5. Инженерные расчеты
- •6.5.1. Расчет эвакуационного выхода.
- •Заключение
3.3 Основная конфигурацияPci
Основная сторона NTB представляет пространство конфигурации типа 0 PCI, включая все требуемые от PCI регистры, такие как ID поставщика, ID устройства, и индексные регистры (BAR).
Расширение конфигурации также содержит несколько возможностей PCI, включая MSI, MSI-x и необходимая возможность PCI Express.
В дополнение к определенным регистрам PCI расширенная конфигурация также содержит пять регистров, для определения функциональности портов. Значения для этих регистров, конфигурируемых пользователем, обычно сохранены в энергонезависимой памяти (такой как флэш-память память) BIOS.
Один из этих регистров - PPD определяет поведение порта. Это может быть сконфигурировано одним из трех путей, но:
Должен быть задействован корневой Порт PCI Express
NTB должен быть соединен с портом PCIe второй системы
NTB должен быть соединен с NTB на второй платформе
Основные регистры PCIe и расширенное представление не транслируемого моста на рисунке 3.4
Первый PBAR01, используется, чтобы управлять поведением NTB так же как для меж коммуникационного процессора. Этот PBAR01имеет фиксированный размер 64 КБ.
Регистры PBARnLMT не могут быть изменены от второго NTB.
• SBAR2LMT и SBAR4LMT – вторичные регистры лимита размера.
Эти регистры выполняют ту же самую функцию как регистры PBARnLMT, но
они затрагивают PBAR на вторичной стороне NTB. Эти регистры
перезаписываемые от обеих сторон NTB, тогда как регистры PBARnLMT не могут будь изменен от вторичной стороны NTB.
• PBAR2XLAT и PBAR4XLAT – Основные регистры Перевода Адреса
Эти регистры связаны с системной памятью на вторичном NTB. Они используются, чтобы направить доступы к PBAR на основной стороне NTB в систему, связанную со вторичном NTB. Пример этого может представлен на рисунке 6. PBAR23, содержит
адрес 0x40000 и составляет 64 КБ в размере. PBAR2XLAT калибруется адресом 500000. Любой доступ от Intel Xeon Processor до адреса между
0x40000 и 0x4FFFF захватывает NTB и преобразовывает доступ к системной памяти по адресам PCI в 0x500000 – 0x50FFFF.
BPAR
01
PPAR
23
PPAR
45
Regs
SBAR
01
SBAR
23
SBAR
45
Коммуникационная среда pci Express
Рис 3.4. Расширенное представление не транслируемого моста.
3.4 Текст программы
Ниже я привожу текст программы, выполняющей тестирование пропускной способности по топологиям: КОЛЬЦО, ПОЛНЫЙ ГРАФ, ЗВЕЗДА. Программа была написана из под ОС Linux Red Hat Enterprise с помощью библиотеки shmem.
static char print_mode = PRINT_AVERAGE_RATES;
unsigned int run_chaos_test = 1;
unsigned int msglen_unit = DEFAULT_MSGLEN_UNIT;
static char unit_char = 'M';
static char unit_str[] = "MB";
unsigned int rate_unit = DEFAULT_RATE_UNIT;
static char rate_unit_str[] = "MB/sec";
int i_am_the_master = 0;
static int msglen_min = MIN_MESSAGE_LENGTH;
static int msglen_max = MAX_MESSAGE_LENGTH;
static int TIMES = DEFAULT_TIMES;
static int msglen_step = 0;
static int msglen_multiplier = 2;
FILE *out;
static char output_file_name[256];
int pool_size,rank;
int MASTER_RANK = MASTER;
#define COMM shmem_COMM_WORLD
static char nodename[32];
static char* nodenames;
int namelen = 32;
void calculate_best_rates(double *R, int n, double *bestR);
void print_help();
/***************************************************************************
Code section
***************************************************************************/
int main (int argc, char *argv[]){
int i;
int msglen;
double R[6] = {0, 0, 0, 0, 0, 0}; /* rates */
double bestR[6] = {0, 0, 0, 0, 0, 0}; /* best rates */
double t0,t1,TestTime;
char processor_name[128];
int namelen = 128;
shmem _Status status;
int repeat = 1,repeatcnt;
out = stdout;
shmem_Init (&argc,&argv);
shmem_Comm_size(COMM,&pool_size);
shmem_Comm_rank(COMM,&rank);
t0 = Wtime();
if (pool_size < 3)
finish( "At least 3 nodes required" );
i_am_the_master = (rank == MASTER ) ? 1 : 0;
/* parse command line */
if(i_am_the_master){
for(i = 1; i < argc; i ++)
switch(argv[i][0]){
case 'h': print_help(); exit(1);
case 'm': msglen_min = atoi(argv[i]+1); break;
case 'M': msglen_max = atoi(argv[i]+1); break;
case 'T': TIMES = atoi(argv[i]+1); break;
case 's': msglen_step = atoi(argv[i]+1); msglen_multiplier = 1; break;
case 'R': repeat = atoi(argv[i]+1); break;
case 'K': msglen_multiplier = atoi(argv[i]+1); msglen_step = 0; break;
case 'P': print_mode = argv[i][1]; break;
case 'C': run_chaos_test = atoi(argv[i]+1); break;
case 'u':
unit_char = argv[i][1];
if(unit_char == 'M'){
msglen_unit = 1024 * 1024;
strcpy(unit_str,"Mb");
}
else if(unit_char == 'K'){
msglen_unit = 1024;
strcpy(unit_str,"Kb");
}
else if(unit_char == 'B' || unit_char == 'b'){
msglen_unit = 1;
strcpy(unit_str,"b");
}
break;
case 'o':
strcpy(output_file_name,argv[i]+1);
out = fopen(output_file_name,"a+");
if(out == NULL){
printf("WARNING: Can't open or create %s, writing to stdout\n",output_file_name);
out = stdout;
}
else
printf("Writing output to %s\n",output_file_name);
break;
default: fprintf(stderr,"WARNING: unrecognized option: %s\n",argv[i]);
break;
}
fprintf(out,"\nNETTEST/shmem of %s is running with following parameters:\n",version_date_string);
fprintf(out,"\tMessage length unit is 1%s = %d bytes\n",unit_str,msglen_unit);
fprintf(out,"\tMessages: %d to %d units, step %d, multiplier %d\n",msglen_min,msglen_max,msglen_step,msglen_multiplier);
fprintf(out,"\t%d times for each test routine, %d iterations for whole test\n",TIMES,repeat);
if(run_chaos_test)
fprintf(out,"\tRunning chaos test with %d logical links used.\n",pool_size*(pool_size-1)/2);
else
fprintf(out,"\tNot running chaos test.\n");
}
shmem_Bcast(&msglen_unit,1, shmem_INT,MASTER,COMM);
shmem_Bcast(&msglen_min,1, shmem_INT,MASTER,COMM);
shmem_Bcast(&msglen_max,1, shmem_INT,MASTER,COMM);
shmem_Bcast(&msglen_step,1, shmem_INT,MASTER,COMM);
shmem_Bcast(&msglen_multiplier,1, shmem_INT,MASTER,COMM);
shmem_Bcast(&repeat,1, shmem _INT,MASTER,COMM);
shmem_Bcast(&TIMES,1,shmem_INT,MASTER,COMM);
shmem_Bcast(&run_chaos_test,1, shmem_INT,MASTER,COMM);
shmem_Get_processor_name(nodename,&namelen);
if(i_am_the_master){
nodenames = (char*) malloc(35*pool_size);
strcpy(nodenames,nodename);
for(i = 1; i < pool_size; i ++){
strcat(nodenames," ");
shmem_Recv(nodename,32, shmem _CHAR,i,2011,COMM,&status);
strcat(nodenames,nodename);
}
fprintf(out,"\tNodes: %s\n",nodenames);
fflush(out);
}
else
shmem_Send(nodename,32, shmem_CHAR,0,2011,COMM);
if(i_am_the_master){
if(print_mode == PRINT_TOTAL_RATES)
fprintf(out,"\n\tNetwork throughput values in %s\n",rate_unit_str);
else
if(print_mode == PRINT_LOCAL_RATES)
fprintf(out,"\n\tLocal node throughput values in %s\n",rate_unit_str);
else
fprintf(out,"\n\tAverage link transfer rates in %s\n",rate_unit_str);
fprintf(out,"Size,%c\tStar\tStar2\tChaos\tChaos2\tRing\tRing2\n",unit_char);
}
for(repeatcnt = 0; repeatcnt < repeat; repeatcnt ++){
for(msglen = msglen_min; msglen <= msglen_max; msglen = msglen * msglen_multiplier + msglen_step){
R[0] = Star(msglen*msglen_unit,TIMES)/rate_unit;
R[1] = Star2(msglen*msglen_unit,TIMES)/rate_unit;
if(run_chaos_test){
R[2] = Chaos(msglen*msglen_unit,TIMES)/rate_unit;
R[3] = Chaos2(msglen*msglen_unit,TIMES)/rate_unit;
}
R[4] = Ring(msglen*msglen_unit,TIMES)/rate_unit;
R[5] = Ring2(msglen*msglen_unit,TIMES)/rate_unit;
#define P pool_size
switch(print_mode){
case PRINT_LOCAL_RATES:
R[0] = R[0] * (P-1);
R[1] = R[1] * (P-1);
R[2] = R[2] * (P-1);
R[3] = R[3] * (P-1);
R[4] = R[4] * 2;
R[5] = R[5] * 2;
break;
case PRINT_TOTAL_RATES:
R[0] = R[0] * (P-1);
R[1] = R[1] * (P-1);
R[2] = R[2] * P * (P-1) / 2;
R[3] = R[3] * P * (P-1) / 2;
R[4] = R[4] * P;
R[5] = R[5] * P;
break;
}
#undef P
calculate_best_rates(R,6,bestR);
if(i_am_the_master){
fprintf(out,"%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",msglen,R[0],R[1],R[2],R[3],R[4],R[5]);
fflush(out);
}
}
}
t1 = Wtime();
TestTime = t1 - t0;
if (i_am_the_master){
fprintf(out,"\nshmem Network Test complete in %.2f sec\n",TestTime);
if(print_mode == PRINT_TOTAL_RATES)
fprintf(out,"\n\tBest network throughput values in %s\n",rate_unit_str);
else
if(print_mode == PRINT_LOCAL_RATES)
fprintf(out,"\n\tBest local node throughput values in %s\n",rate_unit_str);
else
fprintf(out,"\n\tBest average link transfer rates in %s\n",rate_unit_str);
fprintf(out,"\tStar\tStar2\tChaos\tChaos2\tRing\tRing2\n");
fprintf(out,"\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",bestR[0],bestR[1],bestR[2],bestR[3],bestR[4],bestR[5]);
fflush(out);
fflush(stdout);
}
shmem_Finalize();
exit(0);
return 0;
} /* end of main() */
void calculate_best_rates(double *R, int n, double *bestR){
int i;
for(i = 0; i < n; i ++)
if(R[i]>bestR[i])
bestR[i]=R[i];
}
void print_help(){
printf(" Options:\n m[min_msg_length]\n M[max_msg_length]\n T[every_test_repetitions]\n"
" R[whole_test_repetitions]\n s[msg_length_increment]\n K[msg_length_multiplier]\n"
" P[mode]\n C (run chaos test)\n u[units]\n o out_file\n\n"
" mode - t (total rates), a (average rates) or l (local rates)\n"
" units - M (megabytes), K (kilobytes) or b (bytes)\n\n");
}