UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Visitor nila
Visitor
223 次查看
注册日期: ‎12-18-2018

SDSOC 传参有大数组,如何处理?

放到PL端的函数传参是640*640的二维数据,一开始不能综合通过,修改如下之后可以:

#pragma SDS data access_pattern(x:SEQUENTIAL)
#pragma SDS data access_pattern(z:SEQUENTIAL)
#pragma SDS data zero_copy(x,z)
void conv2(unsigned char x[N1][M1], unsigned char y[N2][M2], unsigned short z[N1][M1])

但运行速率下降了很多,比纯软件端跑还慢。本来这个函数在HLS上优化后速率已经是可以接受的了。

请问应如何处理?谢谢!

0 项奖励
3 条回复
Moderator
Moderator
168 次查看
注册日期: ‎05-27-2018

回复: SDSOC 传参有大数组,如何处理?

Hi @nila

      以下pragma指定硬件功能中的数据访问模式, SDSoC将生成AXI Stream接口,以便在整个系统中移动数据,区别在于SEQUENTIAL将生成一个FIFO来存储数据,而RANDOM将生成一个BRAM。以下的指令数据流的方向是:(SEQUENTIAL)AXI-Stream - > FIFO - >加速器。

 #pragma SDS data access_pattern(x:SEQUENTIAL)

      因为不了解程序的功能,在使用SEQUENTIAL优化的时候有一个点需要注意,就是 (UG1235,page 26)写出的,要求SDSoC传输的所有元素,并顺序访问。如果不达到这个要求的话,可以优化为RANDOM,但是默认就是RANDOM,综合出错会不会有其他问题?

access_parton.png
    有问题欢迎继续交流~

 

谢谢,

Wen

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
Visitor nila
Visitor
163 次查看
注册日期: ‎12-18-2018

回复: SDSOC 传参有大数组,如何处理?

Hi ,@wenchen

        感谢回复!代码如下,如果N1和M1的定义为640,640时,就会报array太大,如下:

ERROR: [CF2XD 83-2235] Invalid array size (409600) for bram port 'x_PORTA' on component 'conv2_1'

       如果加入:

#pragma SDS data access_pattern(x:SEQUENTIAL)
#pragma SDS data access_pattern(z:SEQUENTIAL)
#pragma SDS data zero_copy(x,z)

就可以综合通过。但运行时间很长。我的platform中有一个PS为master 的AXI GP0,不知是否合适,请问要如何改进?

void conv2(unsigned char x[N1][M1], unsigned char y[N2][M2], unsigned short z[N1][M1])
{
  int i;
  int j;
  int p;
  int q;

  unsigned short temp = 0;
  int N2_half = (N2-1)>>1;
  int M2_half = (M2-1)>>1;
  int x_1 = 0;
  int x_2 = 0;
  int y_1 = 0;
  int y_2 = 0;

  loop1:
  for(i = 0; i < N1; i++)
  {
    loop2:
    for(j = 0; j < M1; j++)
    {
      #pragma HLS PIPELINE
      temp = 0;

      loop3:
      for(p = 0; p < N2; p++)
      {
        loop4:
        for(q=0; q<M2; q++)
        {
          x_1 = i-N2_half+p;
          x_2 = j-M2_half+q;
          y_1 = N2-p-1;
          y_2 = M2-q-1;

          if((x_1 >= 0) && (x_2 >= 0) && (x_1 < N1) && (x_2 < M1))
          {
             temp += x[x_1][x_2] * y[y_1][y_2];
             // printf("temp[%d][%d](%d) = x[%d][%d] * y[%d][%d];\n",\
             // i, j, temp, i-N2_half+p, j-M2_half+q, (N2-p-1), (M2-q-1));
          }
        }
      }

      z[i][j] = temp;
      // printf("\n");
    }
  }
}

0 项奖励
Moderator
Moderator
113 次查看
注册日期: ‎05-23-2018

回复: SDSOC 传参有大数组,如何处理?

Hi, @nila

你的platform中只有master的AXI接口吗?在SDSoC中,加速器对内存的访问一般都是通过slave AXI接口进行的。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励