Programming languages openmp在kernel32.dll(SleepEx)中产生大量开销
我正在做一个关于使用openmp进行图像处理的项目。 我有一个简单的代码如下。 该程序在我的带有gcc4.3.3的linux平台上顺利运行。 但是该程序在xp平台上运行速度非常慢(VisualStudio2005和英特尔编译器v11)。 经过分析,瓶颈是kernel32.dll中的SleepEx 我的openmp(vc 2005)是否比gcc4.3.3旧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
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)的外部循环进行并行化(