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.

[参考译文] AM5726:OpenCL 高速缓存一致性问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580365/am5726-opencl-cache-coherency-issue

器件型号:AM5726

我们希望使用 OpenCL 在 AM57xx EVM 中的 DSP 上运行一些操作

因此在 ARM 主机端有一个包含指针的结构:

typedef 结构体_abc

   Int A;
   int b;
   char * aPtr;
}abc;

我们希望将其传递给 DSP。

我们从它创建了两个结构

1) 1)用于臂侧的原稿。

2)复制一、包含将传递给 DSP 的原始值的所有值

在这里、我们使用_malloc_DDR 来分配存储器。 并将虚拟地址存储在原始结构的指针参数中

我们知道 DSP 仅了解物理地址而不是虚拟地址、因此我们使用 CMEM_getPhys API 将存储在原始结构指针参数中的虚拟地址转换为物理地址

ARM 端物理地址和 DSP 端物理地址之间的偏移差为0x20000000

因此、从转换的物理地址中减去该偏移量后、我们将其存储在重复结构的指针参数中。

我们将此重复结构传递给 DSP,更新所有参数并在 ARM 端再次获取。

我们发现,我们在 ARM 端获得了指针参数中的更新值,但并非总是如此,有时我们没有得到更新值。

我们发现它始终更新 DSP 端指针中存储的值,如下面的输出所示:

输入臂侧:1577472317 1577472317 61
########## ARM 端物理地址- a2000480 a2000080

[内核0]###### DSP 端物理地址82000480 82000080
[内核0] DSP 端输入参数###### 1577472317 1577472317 61.
[内核0]更改了 DSP 端的值###### 1577472318 1577472319 62.

输出臂侧:1577472318 1577472319 61

因此、由于高速缓存一致性问题、我们有时无法在 ARM 端获取更新后的值。

我们还使用 void __cache_l1d_flush (void) 、 void __cache_l2_flush (void) API 来刷新 DSP 端的缓存,但它也不会为我们提供所需的输出。

那么、有什么方法可以解决 ARM 和 DSP 之间的高速缓存一致性问题(可能在 OpenCL 中)?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    已通知 OpenCL 专家。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    您能解释一下您定义两个结构的原因吗? OpenCL 可以管理与 DSP 之间的数据移动、并在 DSP 与 DSP 之间移动数据时处理高速缓存一致性。

    现在、如果这两个结构的原因是使用本地结构来加快执行速度、我建议 DSP 在完成计算后在内部更新"另一"结构

    明白了吗? 我将把这个 e2e 转交给另一位专家


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

    您好!

    是的、OpenCL 可以管理与 DSP 之间的数据移动、并处理高速缓存一致性。

    但在我们的条件下、我们希望传递一个包含指针的结构、作为其中的参数。

    现在,在 ARM 端使用__malloc_dr 分配内存后,由它返回的虚拟指针存储在指针参数中,

    如果我们将该结构传递给 DSP、并希望通过该指针更改数据、则无法执行该操作、因为 DSP 仅了解物理地址。

    因此我们在 ARM 端复制了该结构,将虚拟指针转换为物理指针,并将其复制到第二个结构的指针参数,然后将该结构传递给 DSP。

    因此、我们可以在 ARM 端和 DSP 端使用自 urctures。

    现在,如果我们不这样做,我们必须将该指针参数作为 DSP 函数的单独参数传递,在这种情况下,OpenCL 将对其进行管理。 但在我们的现有应用程序中,我们在许多函数中使用了这种结构,我们必须在任何地方应用此更改。

    这就是我们希望运行项目应用程序所做更改最小的原因。

    谢谢

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

    在 DSP 端、DSP 必须确保存储器的一致性。 如果 ARM 应该看到新信息、那么每次更改结构时都会进行回写操作。 (您可以禁用结构所在的内存段的缓存)

    在 ARM 端、由于 DSP 使用 CPU 进行写入、因此没有针对 ARM 的一致性检查。 因此、ARM 端需要在每次读取前使存储器失效、并在每次写入存储器时写回

    如果使用 EDMA 将数据从 DSP 移动到 DSP、则 ARM 部分由硬件完成

    它能回答您的问题吗? 我是否完全理解了这个问题?

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

    您好 Harshil、

      我认为您可以让 OpenCL 运行时自动为您管理指针转换和高速缓存一致性、而不是自己明确管理指针转换和高速缓存一致性。  您需要做的是创建一个自包含存储器/缓冲器、即所有方向/指针都引用回到同一存储器/缓冲器。  

     例如、在主机端、您可以执行该操作

    struct _abc *p =(struct _abc *)__malloc_DDR (2 * sizeof (int)+ sizeof (char *)+aPtrLen);
    p->aPtr =((char *) p)+ 2 * sizeof (int)+ sizeof (char *);
    clptr Buffer (char *)(..._use_mclptr、&cl)
    //然后将缓冲区传递到内核 

      在器件/DSP 侧、您可以执行该操作

    __kernel...(...、__global char * restrict in_p)
    {
    struct _abc *p =(struct _abc *) in_p;
    p->aPtr =((char *) p)+ 2 * sizeof (int)+ sizeof (char *);
    

      将结果从内核返回到主机后、您需要重置 aPtr

    p->aPtr =(((char *) p)+ 2 * sizeof (int)+ sizeof (char *); 

       希望这能解决您的问题。

    -元