धागे बनाएं I OpenMP का उपयोग करके सरल एप्लिकेशन लिखने का प्रयास करें। दुर्भाग्य से मुझे गति के साथ समस्या है। इस एप्लिकेशन में मेरे पास एक लूप है। इस पाश के शरीर में कुछ निर्देश होते हैं जिन्हें क्रमशः किया जाना चाहिए और लूप के लिए एक होना चाहिए। मैं लूप समानांतर के लिए इसे बनाने के लिए #pragma omp parallel for
का उपयोग करता हूं। इस लूप में ज्यादा काम नहीं है, लेकिन इसे अक्सर कहा जाता है।ओपनएमपी - केवल एक बार
मैं लूप के दो संस्करण तैयार करता हूं, और 1, 2 और 4cores पर एप्लिकेशन चलाता हूं।
संस्करण 1 (लूप के लिए 4 पुनरावृत्तियों): 22sec, 23sec, 26sec।
संस्करण 2 (लूप के लिए 100000 पुनरावृत्तियों): 20sec, 10sec, 6sec।
जैसा कि आप देख सकते हैं, जब लूप के पास अधिक काम नहीं होता है, तो 2 और 4 कोर पर समय 1core से अधिक होता है। मुझे लगता है कि कारण यह है कि #pragma omp parallel for
लूप के प्रत्येक पुनरावृत्ति में नए धागे बनाता है। तो, मैं आपसे पूछना चाहता हूं - क्या एक बार थ्रेड बनाने के लिए कोई संभावना है (लूप से पहले), और सुनिश्चित करें कि लूप के दौरान कुछ नौकरी अनुक्रमिक रूप से की जाएगी?
#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;
}