我们希望使用 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 中)?
谢谢。