Tôi cố gắng viết ứng dụng đơn giản bằng cách sử dụng OpenMP. Thật không may, tôi có vấn đề với tăng tốc. Trong ứng dụng này, tôi có một vòng lặp while. Nội dung của vòng lặp này bao gồm một số hướng dẫn cần được thực hiện tuần tự và một cho vòng lặp. Tôi sử dụng #pragma omp parallel for
để làm điều này cho vòng lặp song song. Vòng lặp này không có nhiều công việc, nhưng được gọi rất thường xuyên.OpenMP - tạo chủ đề chỉ một lần
Tôi chuẩn bị hai phiên bản cho vòng lặp và chạy ứng dụng trên 1, 2 và 4 lõi.
phiên bản 1 (4 lần lặp trong vòng lặp): 22 giây, 23 giây, 26 giây.
phiên bản 2 (100000 lần lặp trong vòng lặp): 20 giây, 10 giây, 6 giây.
Như bạn thấy, khi vòng lặp không có nhiều công việc, thời gian trên 2 và 4 lõi cao hơn trên 1 lõi. Tôi đoán lý do là #pragma omp parallel for
tạo chủ đề mới trong mỗi lần lặp của vòng lặp while. Vì vậy, tôi muốn hỏi bạn - là có khả năng để tạo ra các chủ đề một lần (trước khi trong khi vòng lặp), và đảm bảo rằng một số công việc trong vòng lặp while sẽ được thực hiện tuần tự?
#include <omp.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
double sum = 0;
while (true)
{
// ...
// some work which should be done sequentially
// ...
#pragma omp parallel for num_threads(atoi(argv[1])) reduction(+:sum)
for(int j=0; j<4; ++j) // version 2: for(int j=0; j<100000; ++j)
{
double x = pow(j, 3.0);
x = sqrt(x);
x = sin(x);
x = cos(x);
x = tan(x);
sum += x;
double y = pow(j, 3.0);
y = sqrt(y);
y = sin(y);
y = cos(y);
y = tan(y);
sum += y;
double z = pow(j, 3.0);
z = sqrt(z);
z = sin(z);
z = cos(z);
z = tan(z);
sum += z;
}
if (sum > 100000000)
{
break;
}
}
return 0;
}