OpenCL运行报错分析与解决MMD INFO : [board0] PCIe-to-fabric read test failed, read 0xffffffff after 1 attempt
在运行opencl程序或者aocl program时,发生报错:
MMD INFO : [board0] PCIe-to-fabric read test failed, read 0xffffffff after 1 attempt
这里board0可能会根据你的实际情况发生变化,为了解决这个问题,我们找到了custom_platform_toolkit中的acl_pcie_device.cpp文件,
可以看到,相关报错的位置在1023行
错误信息提示说在PCIe到FPGA的读取测试中,读取的值为0xFFFFFFFF,这是一个表示无效值的16进制数(-1的补码)。这种情况通常意味着读取操作失败,或者与FPGA通信出现问题。
我们根据源码往前回溯,
version_id_test()这个函数其实是一个Pcie读操作,读取的是版本ID,并进行比对。
从比对的逻辑出发,出现报错的原因无非三种:
1、预设的版本ID本身就是错误的。
2、实际读取的版本ID与预设的不一致。
3、比对的算法有问题。
第3点的发生的可能性几乎为零,该SDK都迭代了这么多版本了。所以我们可以从1-2入手。
当然这里也可以推一下3可能出现错误的地方:a)m_io->version->read32读取时的寄存器地址错了。b)编译环境导致了溢出的发生。c)用户修改错误了sdk。
对于1来说,
根据《Intel® FPGA SDK for OpenCL™: Intel® Arria® 10 SoC Development Kit Reference Platform》1.5章我们得知hw_pcie_constants.h中包含了ACL_VERSIONID信息,
很明显也和读取的0xFFFFFFFF完全没有关系。我们通过工具编译后的mmd文件是否可能存在问题?比如说没有更新,或者使用的错误的文件。这是可以检查的地方之一,虽然我觉得发生的概率不大。
对于2来说,读取到的版本与预设的不一致,这可能是如下几方面的原因:
a、读写存在问题。
b、FPGA没有烧录正确的SOF。
c、SOF存在时序问题。
对于读写存在问题分为两方面,一个是硬件上的问题,一个是软件上的问题,对于硬件上面的问题来说,你可以尝试使用官方的Pcie,DDR4的Demo工程,也可以更换一台电脑或者板卡来测试,看看是否发生了问题,如果是硬件问题,就考虑更换硬件。在另外一个方面,一般来说根据硬件设计的不同,板卡有多种启动方式,这代表着FPGA的启动可能会需要1-10s,如果在启动前进行通信,可能会发生错误。
对于软件上的问题,检查驱动安装是否正确,或者说是否安装了正确的驱动,可以查看设备管理器中板卡的驱动安装状态。也可以尝试更换到Linux下继续。
另外,你也可以尝试重新编译工程,然后下载sof文件,防止烧录了错误的sof文件。或者烧录过程中发生了错误。
对于SOF时序问题的检查和排除方法,虽然Quartus在编译后会给出通过了基本工况下的SOF文件,但是由于板卡的设计问题,可能会导致散热问题,你可以在断电后摸一下板卡是否烫手,如果烫手,可能会发生时序问题,可以增加散热风扇解决。
如果问题仍然存在,可以联系你的板卡提供商的FAE,或者在intel论坛发帖,写清楚你已经排除了的问题,和具体的现象。