# Debug HLS Performance: Limited memory ports In an ideal FPGA implementation, the kernel will process 1 data sample per clock cycle. In the High-Level Synthesis (HLS) technology used in SDAccel, this is referred to an II=1 implementation, where II is the Initiation Interval of design, or the number of clock cycles before the design can read new data inputs. In some cases, the HLS technology is unable to create an II=1 design, and you may see the following message: ``` INFO: [XOCC 204-61] Pipelining loop 'SUM_LOOP'. WARNING: [XOCC 204-69] Unable to schedule 'load' operation ('mem_load_2', /..PATH../MyCode.cl:125) on array 'mem', /..PATH../MyCode.cl:125 due to limited memory ports. Please consider using a memory core with more ports or partitioning the array 'mem'. INFO: [XOCC 204-61] Pipelining result: Target II: 1, Final II: 2, Depth: 42. ``` The message notes that this is **due to limited memory ports** and recommends you **partitioning the array 'mem'**. The is explained in more detail below. # HLS Backgrounder: Mapping to Block-RAM First, let's review how an array in the C code is implemented in FPGA hardware. The HLS technology used in SDAccel maps an array in the kernel code into a Xilinx Block-RAM. - An array is a collection of elements accessed through an index. - A Block-RAM is an embedded RAM: a collection of data elements accessed via an address. The mapping from an array to a Block-RAM is a very natural mapping. It ensures all arrays in the kernel code are mapped to efficient local memory resources in the FPGA. An issue which can present itself, is that the Block-RAMs on the FPGA have only two data ports: only two addresses may be accessed in a single clock cycle. The following kernel code represents code which can limit performance and present a message similar to the one shown above: ``` int mem[N]; int sum=0; int i; SUM_LOOP:for(i=0;i