在 C 中使用 openMP 的简单 for 循环
A simple for-loop with openMP in C
我在下面的代码中有一个for循环。
int min = -1;
int pos;
int array[100];
for(i = 0; i < 100; i++){
if(array[i] < min || min == -1){
min = array[i];
pos = i;
}
}
我认为以下代码是使用 openMP 的正确实现,但它太慢了。
int min = -1;
int pos;
int array[100];
#pragma omp parallel for default(none) shared(array, min)
for(i = 0; i < 100; i++){
#pragma omp critical
{
if(array[i] < min || min == -1){
min = array[i];
pos = i;
}
}
}
我认为如果我将关键部分放在条件内部而不是外部,那可能会造成数据危害。有一种聪明的方法来实现它吗?有什么建议吗?
我编写了一个小型并行搜索函数。我只测试过它可以编译,但我相信原理是正确的:
#include <stddef.h>
#define MINDIVIDE 1024
int parallelminsearch(int const *array, size_t size)
{
int minimum;
if (size < MINDIVIDE)
{
minimum = array[0];
for (size_t i = 1; i < size; i++)
{
if (array[i] < minimum)
minimum = array[i];
}
return minimum;
}
int pmin[2];
#pragma omp parallel for
for (size_t i = 0; i < 2; i++)
{
pmin[i] = parallelminsearch(&array[i*size/2], (size+1)/2);
}
minimum = (pmin[0] < pmin[1])?pmin[0]:pmin[1];
return minimum;
}
我在下面的代码中有一个for循环。
int min = -1;
int pos;
int array[100];
for(i = 0; i < 100; i++){
if(array[i] < min || min == -1){
min = array[i];
pos = i;
}
}
我认为以下代码是使用 openMP 的正确实现,但它太慢了。
int min = -1;
int pos;
int array[100];
#pragma omp parallel for default(none) shared(array, min)
for(i = 0; i < 100; i++){
#pragma omp critical
{
if(array[i] < min || min == -1){
min = array[i];
pos = i;
}
}
}
我认为如果我将关键部分放在条件内部而不是外部,那可能会造成数据危害。有一种聪明的方法来实现它吗?有什么建议吗?
我编写了一个小型并行搜索函数。我只测试过它可以编译,但我相信原理是正确的:
#include <stddef.h>
#define MINDIVIDE 1024
int parallelminsearch(int const *array, size_t size)
{
int minimum;
if (size < MINDIVIDE)
{
minimum = array[0];
for (size_t i = 1; i < size; i++)
{
if (array[i] < minimum)
minimum = array[i];
}
return minimum;
}
int pmin[2];
#pragma omp parallel for
for (size_t i = 0; i < 2; i++)
{
pmin[i] = parallelminsearch(&array[i*size/2], (size+1)/2);
}
minimum = (pmin[0] < pmin[1])?pmin[0]:pmin[1];
return minimum;
}