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];
}
}