2013-11-20 3 views
0

Мне сказали не использовать printf в программах openmp, так как это ухудшает производительность параллельной программы моделирования.printf проблема производительности в openmp

Я хочу знать, что это за заменитель. Я имею в виду, как отображать вывод программы без использования printf.

У меня есть следующий AES-128 проблема моделирования с использованием OpenMP, которая нуждается в дальнейшем комментарии Parallel simulation of AES in C using Openmp

Я хочу знать, как выводить шифрованный текст без снижения производительности моделирования?

Заранее спасибо.

ответ

2

Вы не можете оба иметь свой пирог и есть его. Решите, хотите ли вы иметь большую параллельную производительность или важно увидеть результат алгоритма , а работает параллельный цикл.

Очевидным автономным решением является сохранение открытых текстов, ключей и зашифрованных текстов в массивах. В вашем случае это потребует 119 MiB (= 650000*(3*4*16) байт) в оригинальном случае и только 12 MiB в случае с 65000 проб. Ничего, что современная машина с GiBs RAM не может справиться. Последний случай даже вписывается в кеш последнего уровня некоторых серверных процессоров.

#define TRIALS 65000 

int (*key)[16]; 
int (*pt)[16]; 
int (*ct)[16]; 

double timer; 

key = malloc(TRIALS * sizeof(*key)); 
pt = malloc(TRIALS * sizeof(*pt)); 
ct = malloc(TRIALS * sizeof(*ct)); 

timer = -omp_get_wtime(); 

#pragma omp parallel for private(rnd,j) 
for(i = 0; i < TRIALS; i++) 
{ 
    ... 

    for(j = 0; j < 4; j++) 
    { 
     key[i][4*j] = (rnd[j] & 0xff); 
     pt[i][4*j] = key[i][4*j]; 
     key[i][4*j+1] = ((rnd[j] >> 8) & 0xff) ; 
     pt[4*j+1]  = key[i][4*j+1]; 
     key[i][4*j+2] = ((rnd[j] >> 16) & 0xff) ; 
     pt[i][4*j+2] = key[i][4*j+2]; 
     key[i][4*j+3] = ((rnd[j] >> 24) & 0xff) ; 
     pt[i][4*j+3] = key[i][4*j+3]; 
    } 

    encrypt(key[i],pt[i],ct[i]); 
} 

timer += omp_get_wtime(); 
printf("Encryption took %.6f seconds\n", timer); 

// Now display the results serially 
for (i = 0; i < TRIALS; i++) 
{ 
    display pt[i], key[i] -> ct[i] 
} 

free(key); free(pt); free(ct); 

Чтобы увидеть ускорение, вы должны измерить только время, проведенное в параллельной области. Если вы также измеряете время, необходимое для отображения результатов, вы вернетесь туда, где вы начали.

+0

Христо, у меня нет слов, чтобы поблагодарить вас. У меня недостаточно очков, чтобы дать вам какие-то очки, но я искренне благодарен вам. Большое спасибо вам и всему сообществу stackoverflow за их супер взносы – user2979872

Смежные вопросы