本文作者:赛灵思工程师 Yang Chen
在解答相关问题的时候有碰到过cl_invalid_work_group_size的错误,然后通过报错信息在XRT
github.com/Xilinx/XRT/blob/master/src/runtime_src/xocl/api/clEnqueueNDRangeKernel.cpp
中找到了对应相关抛出该错误的情景,顺便了解work group的概念。
在FPGA加速模型中,内存分为全局内存(global memory)和本地内存(local memory),全局内存的数据是通过PCIe从Host端传输并且存储在片外DDR上,所以有时候会把Host的内存跟全局内存搞混,这其实不是一个概念,这里讲的内存都是针对加速板卡(Alveo系列)上的资源。
Kernel进行一次运行,宏观地来看,数据经过输入,运算,输出完成了一次计算。我们把每份用于kernel最小计算的工作单元集称为工作项(work item),之前提过,计算的数据一般存储在全局内存中。当我们要处理这些数据的时候就需要从全局内存中取出,然后暂存在对应kernel的本地内存中(一般是片上的RAM),再进行计算处理。以我们熟悉的vadd的示例来说,如果host请求需要做4096次加法运算,那么我们就可以看作有4096 个工作项,这一整块我们称之为global size(4096)。然后到kernel端,vadd kernel假设一次能处理256个工作项(即256次加法运算,可以使用循环语句来实现),这一块我们称之为local size(256)。那么256个工作项就可以整体看作一个工作组(work group),整个vadd计算有16个工作组需要排队处理。当然用户只要设置好正确的参数,具体底层的调度可以交给XRT来处理。
回到开头说的cl_invalid_work_group_size的错误上来,后来通过排查,发现Host程序中local size定义的大小和kernel中定义的work group size大小不一致。local size是定义在host程序中的,与其对应设计kernel时定义的实际运行能力产生了偏差,所以导致了该错误,进行修正即可。