线程数和时间结果一致性
thread numbers and time results consistency
我正在尝试学习 xeon phi 编程。
我 运行 在 cpu 上编写此代码,我正在为我想要 运行 在协处理器上 运行 的部分使用卸载编译指示。
因为我在 cpu 上编译并且我使用 offloads ,所以我使用 :
export MIC_ENV_PREFIX=MIC
export MIC_OMP_NUM_THREADS=120
为了指定线程数。
我的问题:
1) Running the code , shows always 40 threads been used.
2) Running again and again the code without compiling , I am getting
different time results.
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <omp.h>
#include <sys/time.h>
#include <cilk/cilk.h>
#include <cilk/reducer_opadd.h>
typedef CILK_C_DECLARE_REDUCER(float) reducer;
double dtime()
{
double tseconds = 0.0;
struct timeval mytime;
gettimeofday(&mytime,(struct timezone*)0);
tseconds = (double)(mytime.tv_sec + mytime.tv_usec*1.0e-6);
return( tseconds * 1000 );
}
float openMPIntegration(
int N,
float * const ioA )
{
float res = 0;
#if DOFFLOAD
#pragma offload target (mic)
{
#endif
#pragma omp parallel for reduction(+:res)
for ( int i = 0; i < N; i++ )
{
res += ioA[ i ];
}
#if DOFFLOAD
}
#endif
return res;
}
float CilkIntegration(
int N ,
float * const ioA )
{
float res = 0;
#if DOFFLOAD
#pragma offload target (mic)
{
#endif
CILK_C_REDUCER_OPADD( sum, float , 0);
CILK_C_REGISTER_REDUCER(sum);
cilk_for ( int i = 0; i < N; i++ )
{
REDUCER_VIEW(sum) += ioA[ i ];
}
res = sum.value;
CILK_C_UNREGISTER_REDUCER(sum);
#if DOFFLOAD
}
#endif
return res;
}
int main()
{
int NbOfThreads;
double tstart, tstop, ttime;
int N = 1000000;
float * A = (float*) _mm_malloc( N * sizeof(*A) , 32 );
//fill A
for ( int i = 0; i < N; i++ )
A[ i ] = i;
#if DOFFLOAD
#pragma offload target (mic)
#endif
#pragma omp parallel
#pragma omp master
NbOfThreads = omp_get_num_threads();
printf("\nUsing %d threads\r\n",NbOfThreads);
tstart = dtime();
float openMPRes = openMPIntegration( N , A );
tstop = dtime();
ttime = tstop - tstart;
printf("\nopenMP integration = %10.3lf msecs \t value = %10.3f", ttime ,openMPRes);
tstart = dtime();
float CilkRes = CilkIntegration( N , A );
tstop = dtime();
ttime = tstop - tstart;
printf("\nCilk integration = %10.3lf msecs \t value = %10.3f", ttime,CilkRes);
printf("\n");
_mm_free( A );
return 0;
}
我正在编译:
icc -std=c99 -DOFFLOAD -openmp -qopt-report -O3 xeon.c -o xeon
严格来说,这不是一个 OpenMP 问题,因为它涉及不同并行 运行 时间模型的不推荐组合,而且我认为您没有使用 openmp 标准化卸载语法。
简短的回答是,没有实施建议结合 OpenMP 和 cilkplus 并行 运行 时间模型。除此之外的下一步是,典型的 OpenMP 模型默认情况下会在一段时间内阻止硬件线程上下文对 OpenMP 外部线程模型的可用性,通常默认为 0.200 秒。
使用 omp 缩减器而不是 cilkplus 缩减器在风格上似乎更一致,但在目前的实现中,这可能不是一个显示停止的决定。
我猜您可能正在使用 Intel 卸载模型,以便同时使用 openmp 标准和非标准卸载语法。
我正在尝试学习 xeon phi 编程。
我 运行 在 cpu 上编写此代码,我正在为我想要 运行 在协处理器上 运行 的部分使用卸载编译指示。
因为我在 cpu 上编译并且我使用 offloads ,所以我使用 :
export MIC_ENV_PREFIX=MIC
export MIC_OMP_NUM_THREADS=120
为了指定线程数。
我的问题:
1) Running the code , shows always 40 threads been used.
2) Running again and again the code without compiling , I am getting different time results.
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <omp.h>
#include <sys/time.h>
#include <cilk/cilk.h>
#include <cilk/reducer_opadd.h>
typedef CILK_C_DECLARE_REDUCER(float) reducer;
double dtime()
{
double tseconds = 0.0;
struct timeval mytime;
gettimeofday(&mytime,(struct timezone*)0);
tseconds = (double)(mytime.tv_sec + mytime.tv_usec*1.0e-6);
return( tseconds * 1000 );
}
float openMPIntegration(
int N,
float * const ioA )
{
float res = 0;
#if DOFFLOAD
#pragma offload target (mic)
{
#endif
#pragma omp parallel for reduction(+:res)
for ( int i = 0; i < N; i++ )
{
res += ioA[ i ];
}
#if DOFFLOAD
}
#endif
return res;
}
float CilkIntegration(
int N ,
float * const ioA )
{
float res = 0;
#if DOFFLOAD
#pragma offload target (mic)
{
#endif
CILK_C_REDUCER_OPADD( sum, float , 0);
CILK_C_REGISTER_REDUCER(sum);
cilk_for ( int i = 0; i < N; i++ )
{
REDUCER_VIEW(sum) += ioA[ i ];
}
res = sum.value;
CILK_C_UNREGISTER_REDUCER(sum);
#if DOFFLOAD
}
#endif
return res;
}
int main()
{
int NbOfThreads;
double tstart, tstop, ttime;
int N = 1000000;
float * A = (float*) _mm_malloc( N * sizeof(*A) , 32 );
//fill A
for ( int i = 0; i < N; i++ )
A[ i ] = i;
#if DOFFLOAD
#pragma offload target (mic)
#endif
#pragma omp parallel
#pragma omp master
NbOfThreads = omp_get_num_threads();
printf("\nUsing %d threads\r\n",NbOfThreads);
tstart = dtime();
float openMPRes = openMPIntegration( N , A );
tstop = dtime();
ttime = tstop - tstart;
printf("\nopenMP integration = %10.3lf msecs \t value = %10.3f", ttime ,openMPRes);
tstart = dtime();
float CilkRes = CilkIntegration( N , A );
tstop = dtime();
ttime = tstop - tstart;
printf("\nCilk integration = %10.3lf msecs \t value = %10.3f", ttime,CilkRes);
printf("\n");
_mm_free( A );
return 0;
}
我正在编译:
icc -std=c99 -DOFFLOAD -openmp -qopt-report -O3 xeon.c -o xeon
严格来说,这不是一个 OpenMP 问题,因为它涉及不同并行 运行 时间模型的不推荐组合,而且我认为您没有使用 openmp 标准化卸载语法。 简短的回答是,没有实施建议结合 OpenMP 和 cilkplus 并行 运行 时间模型。除此之外的下一步是,典型的 OpenMP 模型默认情况下会在一段时间内阻止硬件线程上下文对 OpenMP 外部线程模型的可用性,通常默认为 0.200 秒。 使用 omp 缩减器而不是 cilkplus 缩减器在风格上似乎更一致,但在目前的实现中,这可能不是一个显示停止的决定。 我猜您可能正在使用 Intel 卸载模型,以便同时使用 openmp 标准和非标准卸载语法。