Ho il semplice problema di confrontare tutti gli elementi l'uno con l'altro. Il confronto stesso è simmetrico, quindi, non deve essere fatto due volte.Parallelize per ciclo annidato rispetto alla simmetria di tutto confronto con tutti -in contrario a C++/OpenMP
Il seguente esempio di codice illustra quello che sto cercando, mostrando gli indici degli elementi a cui si accede:
int n = 5;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
printf("%d %d\n", i,j);
}
}
l'output è:
0 1
0 2
0 3
0 4
1 2
1 3
1 4
2 3
2 4
3 4
Così ogni elemento viene confrontato con l'altro una volta . Quando voglio parallelizzare questo codice ho il problema che prima devo attenermi alla programmazione dinamica perché il tempo di calcolo di ogni iterazione varia enormemente E NON posso usare collasso perché le iterazioni nidificate sono index- dipende dal ciclo esterno.
L'utilizzo di #pragma omp parallel for schedule(dynamic, 3)
per l'anello esterno può portare all'estremità single core all'estremità, mentre l'utilizzo di questo per l'anello interno può portare a tali esecuzioni all'interno di ciascuna iterazione del ciclo esterno.
C'è un modo più sofisticato di fare/parallelizzare quello?
L'output è sbagliato. Non dovresti avere 4s lì. –
Hai ragione. Questo è l'output per n = 5. Lo correggerò. –