2010-12-17 5 views
0

Ich mache ein Projekt über Bildverarbeitung mit openmp. Ich habe einen einfachen Code wie folgt. Das Programm lief reibungslos auf meiner Linux-Plattform mit gcc4.3.3. Aber das Programm lief unglaublich langsam auf XP-Plattform (Visual Studio 2005 mit Intel Compiler V11). Nach einer Analyse war der Engpass SleepEx in kernel32.dllopenmp generiert großen Overhead in kernel32.dll (SleepEx)

ist meine openmp (vc 2005) älter als die von gcc4.3.3?

unsigned char **a_data, 
       **b_data, 
       **c_data, 
       *p, 
       *p_a, 
       *p_b, 
       *p_c; 
unsigned long nr, 
       nc; 
nr = nc = 64; 

a_data = (unsigned char **) malloc(nr*sizeof(unsigned char *)); 
p = (unsigned char *) malloc(nr*nc*sizeof(unsigned char)); 
for(int i=0; i<nr; i++) 
{ 
    a_data[i] = p + i*nr; 
} 
b_data = (unsigned char **) malloc(nr*sizeof(unsigned char *)); 
p = (unsigned char *) malloc(nr*nc*sizeof(unsigned char)); 
for(int i=0; i<nr; i++) 
{ 
    b_data[i] = p + i*nr; 
} 
c_data = (unsigned char **) malloc(nr*sizeof(unsigned char *)); 
p = (unsigned char *) malloc(nr*nc*sizeof(unsigned char)); 
for(int i=0; i<nr; i++) 
{ 
    c_data[i] = p + i*nr; 
} 

for(int i=0; i<nr; i++) 
{ 
    p_a = a_data[i]; 
    p_b = b_data[i]; 
    p_c = c_data[i]; 
#pragma omp parallel for 
    for(int j=0; j<nc; j++) 
    { 
     p_a[j] = p_b[j] + p_c[j]; 
    } 
} 

Antwort

0

Wenn ich das richtig verstanden wird SleepEx verwendet, um einen Faden anhängig einer Bedingung auszusetzen - was die Zeit in SleepEx verbrachte schon sagt ist Zeit ein Thread nicht etwas Sinnvolles zu tun ist. Dies wiederum deutet auf eine schlechte Lastverteilung oder Konkurrenz um den Zugriff auf gemeinsame Variablen hin oder auf eine andere Konsequenz der Parallelisierung.

Bevor zu dem Schluss, Springen, dass etwas ‚falsch‘ mit XP gibt es (was richtig sein, aber sie haben mich nicht überzeugt) sollten Sie:

a) Experiment mit der äußeren Schleife Parallelisierung (for(int i=0; i<nr; i++)) eher als der innere. Spielen Sie mit der Loop-Planung herum. Versuchen Sie, die Schleifen zu einem zusammenzufassen.

b) Sei explizit darüber, welche Variablen geteilt und welche privat sind. Ich schreibe Fortran und kann mich nicht erinnern, was die Voreinstellungen für C sind, nur dass sie sich subtil unterscheiden. Ihre temporären Variablen p_a, p_b, p_c können geteilt werden, aber es sieht nicht so aus, als ob sie sein müssten.

c) Ermitteln Sie die Speicherzugriffsmuster Ihres Programms, stellen Sie sicher, dass sie den Cache gut nutzen.

Verwandte Themen