Разделяемые векторы в OpenMP 2 - PullRequest
1 голос
/ 01 апреля 2012

в моем предыдущем вопросе Общие векторы в OpenMP было указано, что можно разрешить различным потокам читать и писать в общем векторе, если разные потоки обращаются к различным элементам вектора.Что, если разные потоки должны прочитать все (иногда одни и те же) элементы вектора, как в следующем случае?

#include <vector> 

int main(){

vector<double> numbers;
vector<double> results(10);
double x;

//write 25 values in vector numbers
for (int i =0; i<25; i++){
    numbers.push_back(cos(i));  
} 

#pragma omp parallel for default(none) \
shared(numbers, results) \
private(x)
    for (int j = 0;  j < 10;  j++){
        for(int k = 0; k < 25; k++){
            x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
        }
        results[j]  =  x;     
    }

    return 0;

}

Будет ли это распараллеливание медленным, потому что только один поток за раз может прочитать любой элемент вектора или это не так?Могу ли я решить проблему с помощью предложения firstprivate(numbers)?

Имеет ли смысл создавать массив векторов, чтобы каждый поток получал свой собственный вектор?

Например:

vector<double> numbersx[**-number of threads-**];

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Чтение элементов одного и того же вектора из нескольких потоков не является проблемой. В вашем коде нет синхронизации, поэтому они будут доступны одновременно.

С размером векторов, с которыми вы работаете, у вас также не будет проблем с кешем, хотя для больших векторов вы можете получить некоторые замедления из-за схемы доступа к кешу. В этом случае отдельные копии числовых данных улучшат производительность.

1 голос
/ 01 апреля 2012

лучший подход:

#include <vector> 

int main(){

vector<double> numbers;
vector<double> results(10);

//write 25 values in vector numbers
for (int i =0; i<25; i++){
    numbers.push_back(cos(i));  
} 

#pragma omp parallel for
    for (int j = 0;  j < 10;  j++){
        double x = 0; // make x local var
        for(int k = 0; k < 25; k++){
            x += 2 * numbers[j] * numbers[k] + 5 * numbers[j * k / 25];
        }
        results[j]  =  x; // no race here     
    }

    return 0;

}

это будет медленно из-за того, что не так много работы, чтобы поделиться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...