取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Highlighted
Visitor
Visitor
281 次查看
注册日期: ‎05-27-2020

sdx中的host和kernel模型数据处理流程问题

跳至解决方案

使用sdx生成的host和kernel进行功能开发。

host和kernel之间的数据处理流程 是否 为:host端将要处理的数据调用clEnqueueWriteBuffer接口写入kernel,然后调用clEnqueueNDRangeKernel执行kernel进行处理,然后调用clEnqueueReadBuffer将数据读回host端。

如果是这样的流程,有没有什么方法可以把读写分开成两个线程,独立存在,写线程持续进行写操作,读线程持续进行读操作,但是怎么保证每次读到的数据是kernel处理完成的数据?而不是读到了重复的数据、或者读到了上次处理的数据?有没有什么可以控制写入数据和读取数据同步的方法?

 

0 项奖励
1 解答

已接受的解答
Highlighted
Moderator
Moderator
189 次查看
注册日期: ‎03-27-2013

Hi @lee479 ,

 

数据/操作相关性一般是用event保证的,这个也是之前我推荐的那个example展示的。

多线程的Example我们也有,类似于:

https://github.com/Xilinx/SDAccel_Examples/tree/master/getting_started/host/multiple_process_c

你的这种方式感觉需要注意跨线程来传递数据/操作的相关性,我暂时没有找到好的例子。

如果你实在没有更好的例子可以参考的话就结合以上两个例子看看改写下吧。

 

Best Regards,
Jason
-----------------------------------------------------------------------------------------------
Please mark the Answer as "Accept as solution" if the information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.
-----------------------------------------------------------------------------------------------

在原帖中查看解决方案

3 回复数
Highlighted
Moderator
Moderator
222 次查看
注册日期: ‎03-27-2013

Hi @lee479 ,

 

使用Xilinx XRT + OpenCL 的好处就是可以由XRT来调度资源分配。

你的需求描述中暂时没有看到程序多线程的必要

建议参考:

https://github.com/Xilinx/Get_Moving_With_Alveo/blob/master/sw_src/05_pipelined_vadd.cpp

用events/event限制任务的先后顺序,由XRT来分配资源(包括CPU),这样理论上来说更加安全高效。

Best Regards,
Jason
-----------------------------------------------------------------------------------------------
Please mark the Answer as "Accept as solution" if the information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.
-----------------------------------------------------------------------------------------------
Highlighted
Visitor
Visitor
210 次查看
注册日期: ‎05-27-2020
感谢回复。
需求是做一个写线程,一直在等待,当有数据传入时,就将数据写入内核进行处理;读线程也在等待,当有数据处理完成后,就从内核读出来。需求来源是因为数据量比较大,几十G左右,要求每秒1GB处理速度。
但是目前我感觉xrt+opencl的架构只能实现写一次数据,执行内核,读一次数据这种操作,这三个顺序必须这样子,不能像我需求写的分成线程去实现。我用线程实现读写分开后,执行内核的操作不论是在写线程实现,还是在读线程实现,读到的数据要么写入了1234567,读出来4567,或者读出来44557之类的,难道只能按照一写,执行内核,一读这种方式进行循环处理吗?
再次感谢解答。
0 项奖励
Highlighted
Moderator
Moderator
190 次查看
注册日期: ‎03-27-2013

Hi @lee479 ,

 

数据/操作相关性一般是用event保证的,这个也是之前我推荐的那个example展示的。

多线程的Example我们也有,类似于:

https://github.com/Xilinx/SDAccel_Examples/tree/master/getting_started/host/multiple_process_c

你的这种方式感觉需要注意跨线程来传递数据/操作的相关性,我暂时没有找到好的例子。

如果你实在没有更好的例子可以参考的话就结合以上两个例子看看改写下吧。

 

Best Regards,
Jason
-----------------------------------------------------------------------------------------------
Please mark the Answer as "Accept as solution" if the information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.
-----------------------------------------------------------------------------------------------

在原帖中查看解决方案