Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БЖД / Дипломный проект Калинин Е.А. 10.05.11 (финал).doc
Скачиваний:
78
Добавлен:
19.03.2015
Размер:
2.33 Mб
Скачать

3.3 Основная конфигурацияPci

Основная сторона NTB представляет пространство конфигурации типа 0 PCI, включая все требуемые от PCI регистры, такие как ID поставщика, ID устройства, и индексные регистры (BAR).

Расширение конфигурации также содержит несколько возможностей PCI, включая MSI, MSI-x и необходимая возможность PCI Express.

В дополнение к определенным регистрам PCI расширенная конфигурация также содержит пять регистров, для определения функциональности портов. Значения для этих регистров, конфигурируемых пользователем, обычно сохранены в энергонезависимой памяти (такой как флэш-память память) BIOS.

Один из этих регистров - PPD определяет поведение порта. Это может быть сконфигурировано одним из трех путей, но:

  1. Должен быть задействован корневой Порт PCI Express

  1. NTB должен быть соединен с портом PCIe второй системы

  1. 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");

}

Соседние файлы в папке БЖД