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
是的,存在竞争条件。tempDistance、closestCluster和closestDistance也应该是私有的。一个很好的检查方法是问自己,如果这些变量同时发生,是否需要每个for循环迭代的这些变量都不同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
你可以用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);
}