Parallel processing OpenMP竞争条件下的并行编程不工作 void ompClassifyToClusteres(点*点,簇*簇,整数 numOfPoints,int numfclusteres,int myid){ int i,j; 集群最紧密的集群; 双近距离; 双温距; omp_集合_num_线程(omp_num_OF_线程); #pragma omp并行专用(j) { #pragma omp for 对于(i=0;i

Parallel processing OpenMP竞争条件下的并行编程不工作 void ompClassifyToClusteres(点*点,簇*簇,整数 numOfPoints,int numfclusteres,int myid){ int i,j; 集群最紧密的集群; 双近距离; 双温距; omp_集合_num_线程(omp_num_OF_线程); #pragma omp并行专用(j) { #pragma omp for 对于(i=0;i,parallel-processing,openmp,Parallel Processing,Openmp,是的,存在竞争条件。tempDistance、closestCluster和closestDistance也应该是私有的。一个很好的检查方法是问自己,如果这些变量同时发生,是否需要每个for循环迭代的这些变量都不同 你可以用private()将它们设置为private子句,或者只是在外部for循环中声明它们。是的,有一个竞争条件。tempDistance、closestCluster和closestDistance也应该是私有的。一个好的检查方法是问问自己,如果这些变量同时发生,是否需要每个fo

是的,存在竞争条件。tempDistance、closestCluster和closestDistance也应该是私有的。一个很好的检查方法是问自己,如果这些变量同时发生,是否需要每个for循环迭代的这些变量都不同


你可以用private()将它们设置为private子句,或者只是在外部for循环中声明它们。

是的,有一个竞争条件。tempDistance、closestCluster和closestDistance也应该是私有的。一个好的检查方法是问问自己,如果这些变量同时发生,是否需要每个for循环迭代的变量都不同


您可以使用private()子句将它们设置为private,就像使用j一样,或者只在外部for循环中声明它们。

如果我理解正确,打印点应该位于并行区域之外。请尝试将#pragma omp for与并行区域相结合(#pragma omp parallel for,并取出打印点。如果我理解正确,打印点应该在并行区域之外。请尝试将#pragma omp for与并行区域相结合(#pragma omp parallel for,并取出打印点)。
void ompClassifyToClusteres(Point* points, Cluster* clusteres, int 
numOfPoints, int numOfClusteres, int myid) {

int i, j;
Cluster closestCluster;
double closestDistance;
double tempDistance;

omp_set_num_threads(OMP_NUM_OF_THREADS);
#pragma omp parallel private(j)
{
#pragma omp for 
    for (i = 0; i < numOfPoints; i++) {
        closestCluster = clusteres[0];
        closestDistance = distanceFromClusterCenter(points[i], closestCluster);

        for (j = 1; j <= numOfClusteres; j++) {
            tempDistance = distanceFromClusterCenter(points[i], clusteres[j]);
            if (tempDistance < closestDistance) {
                closestCluster = clusteres[j];
                closestDistance = tempDistance;
            }
        }
        points[i].clusterId = closestCluster.id;
    }

}


printPoints(points, numOfPoints);



}