2015-03-31 4 views
1

У меня есть цикл for в следующем коде.Простой для цикла с openMP в C

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; 
    } 
    } 
} 

Я думаю, что это может быть опасностью данных, если я поставил критический участок внутри условия, а не снаружи. Есть разумный способ реализовать его? Некоторые предложения?

+4

'min = -1' не должно быть' min == -1'? –

+1

исправьте эту часть .. if (array [i] Logicbomb

+0

Вы можете попробовать запустить параллель, сказать 'quicksort', и при каждом сокращении сохранить также исходный индекс элемента min в подсетевой , – Tigran

ответ

2

Я закодировал небольшую функцию параллельного поиска. Я только тестировал, что он компилируется, но я считаю, что принцип звучит:

#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; 
} 
Смежные вопросы