在 16.1 版本中,由于依赖关系而使外环被串行,而内回路依赖由 #pragma ivdep 删除,则按照预期进行。
由于与内部循环的真正依赖,此循环被串行化
(未签名的 char x = 0;x < 4;x) {
内部循环不具有迭代依赖关系,但取决于外环
#pragma ivdep
对于 (未签名的 char y = 0; y
在 17.0 版本中,#pragma ivdep 现在应用于内环和外回路,因此,外回路的依赖性不会被编译器计入。 因此,尽管在仿真工作,但类似的代码在硬件中可能无法正常工作。
解决 方案:
1. 在内核中添加一个额外的参数"虚拟"。 在主机侧,始终通过第 1 个关于此虚拟参数的参数。
之前
__kernel空 my_kernel(
__global cpx_t* 限制输入,
__global cpx_t* 限制结果)
后
__kernel空 my_kernel(
__global cpx_t* 限制输入,
__global cpx_t* 限制结果,
int dummy)
2. 在循环嵌套中,以"if(虚拟元)"包装内部循环:
由于真正的依赖,此循环被串行化
(未签名的 char x = 0;x < 4;x) {
if (虚拟) {
每组 64 个迭代之间不存在依赖关系
#pragma ivdep
对于 (未签名的 char y = 0; y
此问题计划在面向 FPGA SDK 的英特尔© OpenCL™ 的未来版本中修复。