线程数和时间结果的一致性

乔治

我正在尝试学习至强phi编程。

我在cpu上运行此代码,并且在要在协处理器上运行的部件上使用了卸载编译指示。

由于我在cpu上编译并且使用卸载,因此我在使用:

export MIC_ENV_PREFIX=MIC
export MIC_OMP_NUM_THREADS=120

为了指定线程号。

我的问题:

1)运行代码,始终显示已使用40个线程。

2)一次又一次地运行代码而不进行编译,我得到了不同的时间结果。

代码:

#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
蒂姆18

严格来说,这不是一个OpenMP问题,因为它涉及不建议的不同并行运行时模型的组合,而且我认为您没有使用openmp标准化卸载语法。简短的答案是,没有实现建议将OpenMP和cilkplus并行运行时模型组合在一起。下一步是,默认情况下,典型的OpenMP模型会在一段时间内(通常默认为0.200秒)阻止硬件线程上下文在OpenMP之外对线程模型的可用性。从风格上来说,使用omp减少方法而不是cilkplus减少方法似乎更加一致,但是在目前的实现中,这可能并不是一个决定性的决定。我猜想您可能正在使用Intel卸载模型,以便同时提供openmp标准和非标准卸载语法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程内一致性

来自分类Dev

查询全部和一致性

来自分类Dev

MongoDB和写入/读取一致性

来自分类Dev

查询全部和一致性

来自分类Dev

Cassandra 备份和恢复一致性

来自分类Dev

AWS S3最终一致性和写入后读取一致性

来自分类Dev

如何测试一致性

来自分类Dev

条件协议的一致性?

来自分类Dev

纹波一致性

来自分类Dev

Swift协议一致性

来自分类Dev

评估数组的一致性

来自分类Dev

条件协议的一致性?

来自分类Dev

HKWorkoutSessionDelagate协议一致性

来自分类Dev

ElementTree 元素的一致性

来自分类Dev

OpenMP刷新和所有线程的一致性

来自分类Dev

在多线程内存一致性错误的现实世界的例子?

来自分类Dev

一致性级别仲裁与插入后读取的一致性

来自分类Dev

“强一致性”与“写后读取一致性”

来自分类Dev

分布式系统:保持不同节点之间的时间戳一致性

来自分类Dev

易失性关键字和内存一致性错误

来自分类Dev

C ++中的内存模型:顺序一致性和原子性

来自分类Dev

使用OWL API 4检查本体的一致性和可满足性

来自分类Dev

C ++中的内存模型:顺序一致性和原子性

来自分类Dev

数据存储和Memcache一致性-Google App Engine和Objectify

来自分类Dev

严格一致性与顺序性

来自分类Dev

__threadfence()和L1缓存一致性

来自分类Dev

协议:一致性检查和可选要求为何需要@ObjC?

来自分类Dev

Google数据存储区查询和最终一致性

来自分类Dev

计算着色器和imageStore的内存一致性