This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6678:OpenMP 嵌套、动态和未绑定

Guru**** 2589300 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/582594/tms320c6678-openmp-nested-dynamic-and-untied

器件型号:TMS320C6678

大家好、

我正在 C6678上处理 openmp。 我对嵌套、动态功能和 untied 子句有一些疑问。

嵌套特征

{
#pragma omp parallel for
(i = 0;i > 3;i++)
{
printf ("核心%d 外部\n"、omp_get_thread_num ());
#pragma omp 并行用于
对于(j = 0;j < 3;j++)
printf ("core%d inner\n"、omp_get_thread_num ());
} 

在控制台中打印:

[C66xx_0]core0 outer 
core0 inner
core0 inner
core0 inner
[C66xx_1]core1 outer 
[C66xx_2]core2 outer 
[C66xx_1]core0 inner 
[C66xx_2]core0 inner 
[C66xx_1]core0 inner 
[C66xx_2]core0 inner 
[C66xx_1]core0 inner 
[C66xx_2]core0 inner

为什么 core1和 core2上的嵌套迭代会打印"core0"?  剂量 omp 实际上实现了嵌套功能、在嵌套时会创建新的线程?

2.动态特性

这里的动态特性允许运行时通过 调用 omp_set_dynamic (1)来动态更改并行线程数;.I 读取源代码并发现动态特性是由调用 MultiProc_Resolve_num_threads()的 gomp_set_dynamic (1)实现的。 我想知道什么是 MultiProc_getNumOfProcsInCluster()。  当 使用一个6678板的集群上没有显式配置时、实际上返回。  与 MultiProc_getNumOfProcessor()有何区别。

3. omp 是否实现了 untied 子句? 如果是、那么如何操作呢? 我在源代码中看不到它是清晰的。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请发布 SDK 版本吗?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、,我使用的是 mcsdk_2_01_02_06和 omp_1_01_03_02。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Ruijie

    代码会使我有点困惑。 您的期望是什么?

    (特别是因为条件是 i>3)


    已运行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Ruijie

    我稍微更改了代码-这就是我所做的、我在内核编号(DNUM)和线程编号之间进行了分隔。 我将计数更改为小于3

    空程序2()

       int i、j  ;
        int nthreads、tid;
    用于的#pragma omp 并行
        对于(i = 0;i < 3;i++)
        {
           TID = omp_get_thread_num ();
            printf ("内核%d 线程#%d 外部\n"、DNUM、tid);
    用于的#pragma omp 并行
            对于(j = 0;j < 3;j++)
            {

               printf ("内核%d 线程#%d 内部\n"、DNUM、tid);
            }
       }


    以下是结果 -您可以看到所有内核都在打印、但它们都使用相同的线程。  该线程分布在内核之间:

    C66xx_0]内核0外螺纹#0
    内核0线程#7内核
    内核0线程#7内核
    内核0线程#7内核
    内核0外螺纹#0
    内核0线程#0内部
    内核0线程#0内部
    内核0线程#0内部
    内核0外螺纹#0
    内核0线程#0内部
    内核0线程#0内部
    内核0线程#0内部
    [C66xx_1]内核1外螺纹1
    [C66xx_2]内核2外螺纹# 2外螺纹
    [C66xx_3]内核3外螺纹3
    [C66xx_4]内核4线程#4外部
    [C66xx_5]内核5外螺纹#5
    [C66xx_6]内核6外螺纹#6
    [C66xx_7]内核7外螺纹#7
    [C66xx_1]内核1线程# 0内部
    [C66xx_2]内核2内核线程#0
    [C66xx_3]内核3内核线程#0
    [C66xx_4]内核4线程#0内部
    [C66xx_5]内核5线程#0内部
    [C66xx_6]内核6内核线程#0
    [C66xx_7]内核7内核线程#0
    [C66xx_1]内核1线程# 0内部
    [C66xx_2]内核2内核线程#0

    现在、printf 的一个问题是它不保留时序、 也就是说、第2行在第1行之前并不意味着第2行在第1行之前打印、 这是因为 CCS 读取多个内核的 printf 数据的方式。

    无论如何、它看起来都不像您所期望的那样。  因此、我将把这个案例发送给开发人员、看看他们说什么

    我将在这里发布答案

    已运行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你、RAN、
    很抱歉耽误你的回答。 这是一个误判。 我的意思是我< 3。 感谢您对第一个问题的帮助。
    在我的第一篇帖子中、您能帮我解决第二和第三个问题吗? 是否有任何提示或建议?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有任何提示吗?