2011-03-14 18 views
17

मैं एक छोटे से अनुप्रयोग पर काम कर रहा हूं जो मैट्रिक्स के साथ एक सरणी को गुणा करता है। यह बिना किसी समस्या के काम करता है। मैं आवेदन के निष्पादन समय को मापने के लिए loking हूँ। मैं प्रत्येक प्रक्रिया (इसके आरंभ और समापन) के निष्पादन के व्यक्तिगत समय को पा सकता हूं लेकिन मुझे वैश्विक समय की आवश्यकता है।एमपीआई वैश्विक निष्पादन समय

यह मेरा कोड है:

int main(int argc, char **argv){ 
    int rang, procesus; 
    MPI_Status statut; 
    double start, end, max_end = 0, min_start = 10000; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rang); 
    MPI_Comm_size(MPI_COMM_WORLD, &procesus); 
    MPI_Barrier(MPI_COMM_WORLD); 

    start = MPI_Wtime(); 
    printf("Starting time of process n. %d %f\n",rang, start); 
    if(rang==0){ 
     //Master work 
    }else{ 
     //slaves work 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 
    end = MPI_Wtime(); 
    printf("Ending time of process n.%d %f\n\n\n",rang, end); 

    MPI_Finalize(); 
//Out of the Parallelized task 

    if(min_start > start){ 
     min_start = start; 
     printf("New minumum starting time %f\n", min_start); 
    } 

    if(max_end < end){ 
     max_end = end; 
     printf("New maximum ending time %f\n", max_end); 
    } 

    if(rang == 0){ 
     printf("Start %f\n", min_start); 
     printf("End %f\n", max_end); 
    } 
    return 0; 
} 

मैं varables min_start और के रूप में "वैश्विक" चर max_end का उपयोग अधिकतम और सभी प्रक्रियाओं का न्यूनतम temps को पकड़ने की कोशिश करने के लिए, लेकिन मैं हमेशा शुरू हो जाते हैं और न खत्म होने वाली निष्पादित करने की आखिरी प्रक्रिया का टीएम, समापन समय ठीक है, लेकिन शुरुआती समय गलत है क्योंकि आखिरी प्रक्रिया शुरू करने वाली पहली थी। मैं क्या गलत कर रहा हूं? क्या मैं सभी प्रक्रियाओं के लिए एमपीआई में वास्तव में वैश्विक चर का उपयोग कर सकता हूं, और यदि मैं कैसे कर सकता हूं?

है यही कारण है कि मैं उत्पादन

Starting time of process n.2. 0.101562 
Ending time of process n.2. 0.105469 
New minumum starting time 0.101562 
New maximum ending time 0.105469 

Starting time of process n.3. 0.058594 
Ending time of process n.3. 0.062500 
New minumum starting time 0.058594 
New maximum ending time 0.062500 

Starting time of process n. 4. 0.007812 
Ending time of process n. 4. 0.011719 
New minumum starting time 0.007812 
New maximum ending time 0.011719 

Starting time of process n.1. 0.148438 
Ending time of process n.1. 0.152344 
New minumum starting time 0.148438 
New maximum ending time 0.152344 

Starting time of process n.0. 0.207031 
Ending time of process n.0. 0.210938 
New minumum starting time 0.207031 
New maximum ending time 0.210938 

Start 0.207031 
End 0.210938 

उत्तर

8

MPI_Init() और MPI_Finalize() शुरुआत और समानांतर निष्पादन के अंत में, केवल शुरुआत है और जहां एमपीआई कॉल की अनुमति है का अंत नहीं है के रूप में की है। एमपीआई में, आपकी सभी प्रक्रियाएं शुरुआत से अंत तक समानांतर चलती हैं और कोई भी वैश्विक डेटा साझा नहीं करती हैं।

न्यूनतम प्रारंभिक समय और प्रक्रियाओं के अधिकतम समाप्ति समय को खोजने के लिए आप MPI_Reduce() का उपयोग कर सकते हैं।

+2

अलग-अलग नोड्स से प्रारंभ/समाप्ति समय का उपयोग कर रनटाइम की गणना करने से अमान्य परिणाम मिल सकते हैं यदि घड़ियों को सिंक्रनाइज़ नहीं किया जाता है। –

+0

हाय ... हाँ ... समस्या को हल करने के लिए मैं MPI_Reduce को सभी प्रक्रियाओं के प्रारंभिक और समाप्ति समय के अधिकतम और मिनट को खोजने के लिए जोड़ता हूं ... टिप के लिए धन्यवाद ... :) – jomaora

+0

@ShawnChin, आपका मतलब क्या है? यदि घड़ी सिंक्रनाइज़ नहीं होती है तो प्रारंभ और समाप्ति समय अलग-अलग हो सकता है (संभवतः पूरी तरह से) अलग है, लेकिन वर्तमान में प्रक्रिया के लिए उनका अंतर समाप्त हो गया है, इसलिए या तो मैं कुछ गलत कह रहा हूं या आपका मतलब कुछ और है। क्या तुम समझा सकते हो? पहले ही, आपका बहुत धन्यवाद। –

31

ज्यादातर मामलों में, मास्टर नोड पर केवल प्रारंभ और समाप्ति समय पर ट्रैक रखने के लिए पर्याप्त होता है और केवल मास्टर पर वैश्विक रन टाइम प्राप्त होता है।

ध्यान देने योग्य एक बात है कि आप अंत समय से पहले शुरू करने का समय (सुनिश्चित करें कि सभी नोड्स आगे बढ़ने के लिए तैयार कर रहे हैं बनाने के लिए) का संग्रह से पहले एक बाधा डालना होगा, और है (सुनिश्चित करें कि सभी नोड्स किया जाता है बनाने के लिए) ।

double start, end; 

MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */ 
start = MPI_Wtime(); 

/* ... do work ... */ 

MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */ 
end = MPI_Wtime(); 

MPI_Finalize(); 

if (rank == 0) { /* use time on master node */ 
    printf("Runtime = %f\n", end-start); 
} 

सभी नोड्स पर एक ही कर MPI_Barrier कॉल से कितनी जल्दी प्रत्येक नोड रिटर्न के आधार पर छोटे विचलन के साथ लगभग एक ही परिणाम प्राप्त होंगे। यह आमतौर पर सबसे व्यावहारिक रनों के सापेक्ष एक बहुत छोटा मूल्य होता है और इसे छूट दी जा सकती है।

विभिन्न नोड्स से प्रारंभ/समाप्ति समय का उपयोग करके समय निकालने का प्रयास करना प्रयास के लायक नहीं है, और MPI_Wtimeglobal synchronised clock का उपयोग नहीं करते हैं तो आपके गलत उत्तर दे सकते हैं। ध्यान दें कि कुछ एमपीआई कार्यान्वयन में सिंक किया गया Wtime समर्थित नहीं है (MPI_WTIME_IS_GLOBAL देखें)।

+0

हाय। जवाब के लिए धन्यवाद। असल में मैं अभी भी अपने आउटपुट के कारण उलझन में हूं। प्रक्रिया 0 मेरी मास्टर प्रक्रिया है लेकिन यह अन्य प्रक्रियाओं के बाद शुरू होती है (मान लें कि अन्य प्रक्रियाओं में काम करने से मास्टर से भेजे गए कुछ जानकारी की आवश्यकता होती है)। मैं आसानी से ढूंढ सकता हूं कि कौन सी प्रक्रियाएं शुरू होती हैं जो पहले शुरू होती हैं (मेरे आउटपुट में # 4) लेकिन मुझे नहीं पता कि इस निष्पादन को खत्म करने के बाद इस मूल्य को कैसे सहेजना है और इसे समाप्त करने वाली अंतिम प्रक्रिया में प्राप्त करना है। – jomaora

+2

@jomaora।एमपीआई में, आपके चर प्रक्रियाओं में साझा नहीं होते हैं। प्रत्येक प्रक्रिया 'स्टार्ट', 'एंड',' मिन_स्टार्ट ',' max_end' 'का अपना संस्करण देखती है, यही कारण है कि आपके कोड में, प्रत्येक प्रक्रिया कहती है कि' min_start' उनका प्रारंभ समय है, और 'max_end' उनका अंत है पहर। प्रिंट का आखिरी ब्लॉक हमेशा अपनी शुरुआत और समाप्ति समय को पी 0 प्रिंट करेगा। यदि आप सभी प्रोसेसर में न्यूनतम/अधिकतम मूल्य का पता लगाना चाहते हैं, तो @suszterpatt का उल्लेख करें और 'एमपीआई_ रेडूस' का उपयोग करें। –

+2

शॉन .. आपने मेरा जीवन बचाया! – Crasher

संबंधित मुद्दे