Showing results for 
Search instead for 
Did you mean: 

Unable to compile OpenCL kernel for FPGAs in Devcloud

Hello all,

I'm trying to compile an OpenCL kernel for an FPGA in the Devcloud, using the supplied version of `aoc`. The kernel itself is attached to the post (It has a .c ending because the forum wouldn't allow me to upload a .cl file) and I've run the compilation task (`aoc`) on an fpga-compile node using `qsub -l nodes=1:fpga_compile:ppn=2 -d .`. The job ran for about an hour, but then failed with the following output:

aoc: Running OpenCL parser....
aoc: OpenCL parser completed 
aoc: Linking Object files....
aoc: Optimizing and doing static analysis of code...
aoc: First stage compilation completed successfully.
aoc: Compiling for FPGA. This process may take several hours to complete.  Prior to performing this compile, be sure to check the reports to ensure the design will meet your performance targets.  If the reports indicate performance targets are not being met, code edits may be required.  Please refer to the Intel FPGA SDK for OpenCL Best Practices Guide for information on performance tuning applications for FPGAs.
Error (213009): File name "output_files/afu_import.green_region.pmsf" does not exist or can't be read
Error: Quartus Prime Convert_programming_file was unsuccessful. 1 error, 0 warnings
Error (23031): Evaluation of Tcl script compile_script.tcl unsuccessful
Error: Quartus Prime Shell was unsuccessful. 1 error, 0 warnings
Error (23031): Evaluation of Tcl script build/entry.tcl unsuccessful
Error: Quartus Prime Shell was unsuccessful. 1 error, 0 warnings

I was able to reproduce this exact error multiple times, even by compiling SYCL programs for an FPGA using `dpcpp`. Is this a known error and what may be it's cause?

0 Kudos
4 Replies

There is a workaround: One of the first things the compiler does is to create a lot of files. Once possible, you need to copy the file "gauss/build/output_files/dcp.green_region.pmsf" to "gauss/build/output_files/afu_import.green_region.pmsf". After this is done, the compiler completes it's task without a problem.

However, I'm not able to run this kernel on an fpga node. I've attached the host code to the post, which I compiled with the command

gcc -lstdc++ -lOpenCL gauss.cpp -o gauss -DFPGA -DMATRIX_SIZE=4 -DDESIRED_PLATFORM_INDEX=1

Since the OpenCL headers aren't available in the Devcloud, I had to use my x86-64 computer running a current Arch Linux. I've installed `intel-compute-runtime` version 20.02.15268-1, `ocl-icd` version 2.2.12-3, `opencl-headers` version 2:2.2.20170516-2, and `gcc` version 9.2.0-4.

Once I uploaded the created executable and allocated an interactive FPGA node, I ran the executable, which created the following output:

Platform retrieved
Context created
Command queue created
Matrix loaded
Error initializing DMA: not found
Error initializing DMA
Kernel enqueued
Hardware CSR version ID differs from version expected by software.  Either:
   a) Ensure your compiled design was generated by the same ACL build
      currently in use, OR
   b) The host can not communicate properly with the compiled kernel.
Saw version=65535, expected=4.
gauss-host: acl_kernel_if.cpp:957: void acl_kernel_if_launch_kernel_on_custom_sof(acl_kernel_if*, cl_uint, acl_dev_kernel_invocation_image_t*, cl_int): Assertion `0' failed.

To me, it looks like the DMA to load the kernel into the FPGA could not be found, which therefore lead to the failure of the program. Am I missing an environment variable or something?

0 Kudos

Hi Jan-Oliver,

Thanks for the feedback. We'll take a look for the best FPGA stakeholder route for this issue.



0 Kudos

Oh, there's another update: Apparently, you have to tell aoc which BSP to use. Otherwise, it will use none or a wrong one and the computer can't communicate with the FPGA card once it was programmed. The setup is the same as described before, but I'm using

aoc -o gauss.aocx -board=pac_a10 -board-package=/opt/intel/inteloneapi/compiler/2021.1-beta03/linux/lib/oclfpga/board/intel_a10gx_pac

instead of

aoc -o gauss.aocx

Once the workaround from above is implemented (copying `gauss/build/output_files/dcp.green_region.pmsf` to `gauss/build/output_files/afu_import.green_region.pmsf` once possible) and the compilation is complete, the kernel can be used just fine.

The only problem that's left is the fact that the file `gauss/build/output_files/dcp.green_region.pmsf` is either non-existent or isn't generated.

0 Kudos

Did you get this resolved? Note that the error:

Error (213009): File name "output_files/afu_import.green_region.pmsf" does not exist or can't be read

is a cryptic message that has been fixed with a patch. Refer to the github site: and navigate to the section on login script

Basically add this to your .bashrc

if [ -f /data/intel_fpga/ ]; then 

source /data/intel_fpga/


see the two functions in the script and try them out



0 Kudos