我在尝试并行化算法时遇到了一些问题。目的是对 100x100 矩阵进行一些修改。当我在没有 openMP 的情况下运行算法时,一切都在大约 34-35 秒内顺利运行,当我在 2 个线程上并行化时(我需要它只有 2 个线程),它会下降到 22 秒,但输出是错误的,我认为它是我无法解决的同步问题。
这是代码:
for (p = 0; p < sapt; p++){
memset(count,0,Nc*sizeof(int));
for (i = 0; i < N; i ++){
for (j = 0; j < N; j++){
for( m = 0; m < Nc; m++)
dist[m] = N+1;
omp_set_num_threads(2);
#pragma omp parallel for shared(configurationMatrix, dist) private(k,m) schedule(static,chunk)
for (k = 0; k < N; k++){
for (m = 0; m < N; m++){
if (i == k && j == m)
continue;
if (MAX(abs(i-k),abs(j-m)) < dist[configurationMatrix[k][m]])
dist[configurationMatrix[k][m]] = MAX(abs(i-k),abs(j-m));
}
}
int max = -1;
for(m = 0; m < Nc; m++){
if (dist[m] == N+1)
continue;
if (dist[m] > max){
max = dist[m];
configurationMatrix2[i][j] = m;
}
}
}
}
memcpy(configurationMatrix, configurationMatrix2, N*N*sizeof(int));
#pragma omp parallel for shared(count, configurationMatrix) private(i,j)
for (i = 0; i < N; i ++)
for (j = 0; j < N; j++)
count[configurationMatrix[i][j]] ++;
for (i = 0; i < Nc; i ++)
fprintf(out,"%i ", count[i]);
fprintf(out, "\n");
}
其中:sapt = 100;count -> 它是一个向量,它包含我在每一步中拥有的矩阵的每个元素的数量;
(例如:count[1] = 60
--> 我的矩阵中有元素 '1' 60 次,依此类推)
dist --> vector
这让我拥有从元素 i,j 的最大距离,比如说值 K 到相同值 K 的元素 k,m。
(例如:dist[1] = 10
--> 从值为 1 的元素到值为 1 的最远元素的距离)
然后我把东西写在一个输出文件中,但同样是错误的输出。