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**** 2551110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/600757/tms320c6678-initialization-of-local-values-is-not-correct-with-openmp-runtime

器件型号:TMS320C6678

您好!

我的客户说以下函数在 OpenMP 运行时不起作用。 使用 "omp parallel for "时、本地贵重物品(阵列和结构形式)的初始化似乎不正确。
请查看以下代码和内联注释。

#include 
#include 

struct struct_AB{
uint32_t a;
uint32_t b;
};

//返回值应为0、但结果不为0。 这意味着 s 的数组未正确初始化为0。 这不是预期行为
uint32_t omp_test1 (uint32_t *数据、uint32_t 大小){
uint32_t i;
memset (data、0、size * sizeof (uint32_t)));

#pragma omp parallel for
(i = 0;i < size;i++){uint32_t



}= 0[t、

t = uint32];t = uint32_s = 0[t};t = uint32]
对于(i = 0;i < size;i++){
sum += data[i];
}
return sum;
} 
//返回值应为0,但结果不是0。 这意味着 s 的结构未正确初始化为0。 这不是预期行为 uint32_t omp_test2 (uint32_t *数据、uint32_t 大小){ uint32_t i; memset (data、0、size * sizeof (uint32_t))); #pragma omp parallel for (i = 0;i < size;i++){ = uint32_t };t =.structure = 0;t = uint32_t = t = t + t = t};t = uint32_t = t = t = t 对于(i = 0;i < size;i++){ sum += data[i]; } return sum; }

我尝试了这些函数、并在最新的 ProcSDK 发行环境(版本03.03.00)中重新创建了 C6678 EVM 上的问题。 此外、我尝试了最新的编译器版本(v8.2)、但问题仍然存在。 您是否有任何建议来解决此问题? 请注意、提供这些函数只是为了重新创建问题、客户使用的实际 omp 函数看起来不同、但在其原始 omp 函数中看到了相同的问题(初始化在"omp parallel for "范围内不正确)。

此致、
Naoki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅供参考:
    您可以使用以下链接中共享的示例代码重新创建问题:
    e2e.ti.com/.../600774

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

    我已通知工厂团队。 他们的反馈将在此处发布。

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

    您是否看到独立 OMP 项目或与 NIMU/NDK 结合出现的问题? 如果是后者、您是否尝试按照 e2e.ti.com/.../2209176中的建议切换 osal 函数

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

    您好、Garrett、

    我尝试并发现独立 OMP 项目也出现了此问题。 我在这里`ve 了 CCS 项目。

    e2e.ti.com/.../sample_5F00_openmp.zip

    此致、
    Naoki

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

    "问题"似乎仅限于"初始化在"针对""的 omp parallel 范围内不正确。 一旦下面的初始化代码移出、结果是预期的。 实际上,下面的初始化代码应从 omp 并行区域中移出。 让我确认这是否真的是一个问题。

    uint32_t s[2]={0、0};
    struct struct_AB s ={0、0};

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

    是的,`ve 我已经说过客户将其从 omp 范围移出,但他们说应该支持。 他们认为这可能是 C6x 编译器中的错误。 请注意、正如我在上一个帖子中提到的、它们的功能与共享代码看起来非常不同。 他们似乎在 omp 范围内使用了一些局部变量、并且面临着本地变量初始化的问题、正如我们看到的那样。

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

    您好、Garrett、

    您能否更新此问题的进度?

    此致、

    Naoki

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

    您好、Naoki、

    这是 cl6x 编译器中的一个错误。 它未正确处理并行区域内聚合变量(结构或数组)声明的初始化。  我像这样解决了这个问题:

    #if 0
           uint32_t s[2]={0、0};
    其他
           uint32_t s[2];
           S[0]= 0;
           S[1]= 0;
    #endif

    我将针对编译器提交错误报告。

    此致、Eric