Programming languages openmp在kernel32.dll(SleepEx)中产生大量开销

Programming languages openmp在kernel32.dll(SleepEx)中产生大量开销,programming-languages,parallel-processing,Programming Languages,Parallel Processing,我正在做一个关于使用openmp进行图像处理的项目。 我有一个简单的代码如下。 该程序在我的带有gcc4.3.3的linux平台上顺利运行。 但是该程序在xp平台上运行速度非常慢(VisualStudio2005和英特尔编译器v11)。 经过分析,瓶颈是kernel32.dll中的SleepEx 我的openmp(vc 2005)是否比gcc4.3.3旧 unsigned char **a_data, **b_data, **c

我正在做一个关于使用openmp进行图像处理的项目。 我有一个简单的代码如下。 该程序在我的带有gcc4.3.3的linux平台上顺利运行。 但是该程序在xp平台上运行速度非常慢(VisualStudio2005和英特尔编译器v11)。 经过分析,瓶颈是kernel32.dll中的SleepEx

我的openmp(vc 2005)是否比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];
    }
}
无符号字符**a\u数据,
**b_数据,
**c_数据,
*p,
*p_a,
*普布,
*p_c;
无符号长nr,
数控;
nr=nc=64;
a_data=(无符号字符**)malloc(nr*sizeof(无符号字符*);
p=(无符号字符*)malloc(nr*nc*sizeof(无符号字符));

对于(int i=0;i如果我理解正确,
SleepEx
用于挂起挂起某个条件的线程,这表明在SleepEx中花费的时间是线程没有做任何有用的事情的时间。这反过来又表明负载平衡不良或对共享变量的访问争用,或者parallelis的其他一些后果反倾销

在得出XP存在“错误”的结论之前(这可能是正确的,但你还没有说服我),你应该:

a) 对(int i=0;i)的外部循环进行并行化(