का उपयोग करके openmp को संकलित करने के लिए मुझे openmp संकलन के बारे में कोई समस्या है।g ++
निम्नलिखित कोड की तरह:
#include <iostream>
#include <pthread.h>
#include <omp.h>
#include <semaphore.h>
#include <stack>
using namespace std;
sem_t empty,full;
stack<int> stk;
void produce(int i)
{
{
sem_wait(&empty);
cout<<"produce "<<i*i<<endl;
stk.push(i*i);
sem_post(&full);
}
}
void consume1(int &x)
{
sem_wait(&full);
int data=stk.top();
stk.pop();
x=data;
sem_post(&empty);
}
void consume2()
{
sem_wait(&full);
int data=stk.top();
stk.pop();
cout<<"consume2 "<<data<<endl;
sem_post(&empty);
}
int main()
{
sem_init(&empty,0,1);
sem_init(&full,0,0);
pthread_t t1,t2,t3;
omp_set_num_threads(3);
int TID=0;
#pragma omp parallel private(TID)
{
TID=omp_get_thread_num();
if(TID==0)
{
cout<<"There are "<<omp_get_num_threads()<<" threads"<<endl;
for(int i=0;i<5;i++)
produce(i);
}
else if(TID==1)
{
int x;
while(true)
{
consume1(x);
cout<<"consume1 "<<x<<endl;
}
}
else if(TID==2)
{
int x;
while(true)
{
consume1(x);
cout<<"consume2 "<<x<<endl;
}
}
}
return 0;
}
सबसे पहले, मैं इसे का उपयोग कर संकलन:
g++ test.cpp -fopenmp -lpthread
और, मैं सही जवाब मिल गया है, वहाँ 3 धागे पूरी तरह से कर रहे हैं।
लेकिन, जब मैं इस तरह संकलन कार्य करें:
g++ -c test.cpp -o test.o
g++ test.o -o test -fopenmp -lpthread
सिर्फ केवल एक धागा है।
कोई भी मुझे बता सकता है कि इस कोड को सही तरीके से कैसे संकलित करें। पहले ही, आपका बहुत धन्यवाद।
मुझे लगता है कि ओपनएमपी प्रागम्स को तब तक अनदेखा किया जाता है जब तक आपके पास '-फॉपेंम्प' न हो। इसलिए आपको ओपनएमपी प्रोग्राम्स वाले सभी मॉड्यूल पर '-फॉपेंम्प' की आवश्यकता होगी। – Mysticial
@ मैस्टिसियल आपको लगता है कि जब मैं .cpp को .o फ़ाइल संकलित करता हूं तो मुझे -fopenmp जोड़ना चाहिए? –
हाँ। 'G ++ -c test.cpp -o test.o -fopenmp' आज़माएं। अगर यह काम करता है तो मैं इसे उत्तर दूंगा। – Mysticial