Gavin¥ 2021-09-07 15:37 采纳率: 100%
浏览 37
已结题

学习OpenMP的copyin中的小疑问

int COPYIN_A = 100;
#pragma omp threadprivate(COPYIN_A)  
void TestCopyin2()
{
    omp_set_num_threads(4);
#pragma omp parallel
    {
        printf("No.%d - Initial COPYIN_A = %d\n", omp_get_thread_num(), COPYIN_A);
        COPYIN_A = omp_get_thread_num();
        printf("get threadNo COPYIN_A: %d\n", COPYIN_A);
    }
    printf("Global COPYIN_A: %d\n\n", COPYIN_A);

#pragma omp parallel copyin(COPYIN_A)            // copyin
    {
        printf("No.%d - Initial COPYIN_A = %d\n", omp_get_thread_num(), COPYIN_A);
        COPYIN_A = omp_get_thread_num();
        printf("get threadNo COPYIN_A: %d\n", COPYIN_A);
    }
    printf("Global COPYIN_A: %d\n\n", COPYIN_A);

#pragma omp parallel                // Will not copy, to check the result.
    {
        printf("No.%d - Initial COPYIN_A = %d\n", omp_get_thread_num(), COPYIN_A);
        COPYIN_A = omp_get_thread_num();
        printf("get threadNo COPYIN_A: %d\n", COPYIN_A);
    }
    printf("Global COPYIN_A: %d\n", COPYIN_A);
}

为什么每一段的Global COPYIN_A的值永远等于0?为什么第三段COPYIN_A的赋值在输出之后,但输出的COPYIN_A值与后面的赋值之后的COPYIN_A值一致?

img

  • 写回答

4条回答 默认 最新

  • 地球屋里老师 2021-09-07 22:49
    关注

    第一段,初始值是人为给定的100,结束值为线程号;
    输出 Global 的语句,没在并行域中,因此是主线程执行,输出主线程的值;
    第二段,使用了copyin,每个线程的初始值等于主线程的值,也就是 0;结束后,各个线程的值等于线程号;
    第三段,初始值为线程号,是第二段修改的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 9月17日
  • 已采纳回答 9月9日
  • 修改了问题 9月7日
  • 修改了问题 9月7日
  • 展开全部

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络