Вы не можете оба иметь свой пирог и есть его. Решите, хотите ли вы иметь большую параллельную производительность или важно увидеть результат алгоритма , а работает параллельный цикл.
Очевидным автономным решением является сохранение открытых текстов, ключей и зашифрованных текстов в массивах. В вашем случае это потребует 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);
Чтобы увидеть ускорение, вы должны измерить только время, проведенное в параллельной области. Если вы также измеряете время, необходимое для отображения результатов, вы вернетесь туда, где вы начали.
Христо, у меня нет слов, чтобы поблагодарить вас. У меня недостаточно очков, чтобы дать вам какие-то очки, но я искренне благодарен вам. Большое спасибо вам и всему сообществу stackoverflow за их супер взносы – user2979872