我正在构建一个简单的C ++服务器,我通过POST请求接收图像,将其发送到GPU进行处理,一旦我从GPU获得结果,就发回响应。
为了能够处理多个同时连接(以及学习新东西),我正在使用Boost :: asio,遵循使用boost :: asio :: coroutine的server4示例(link)。我遇到的问题是如何在不阻止协程的情况下将数据从协程发送到GPU。
当GPU可以一起处理一批请求时,它是最有效的。但即使一次处理一个请求(不能作为CPU和内存IO进行上下文切换是瓶颈),它必须在开始下一个请求之前处理完整的请求。这意味着我需要对来自协同程序的请求进行排队,并在GPU处理完成时以某种方式发出协同信号。
正在查看boost :: asio参考文献,但没有任何内容正在跳出来。一般来说,如果不能立即生成响应(例如可能需要约500毫秒),如何使用增强asio协同程序。这通常是怎么做的?
答案 0 :(得分:0)
设置与GPU交互的程序部分,以在其自己的线程上运行。当您收到需要GPU的请求时,请将图像数据以及套接字对象和其他所需参数打包,并将其推入(可能是互斥锁定的)队列。然后,gpu线程可以从队列中拉出,执行其工作,然后在io_service上生成一个新任务,以使用存储在结构中的信息完成与客户端的事务。
可以将gpu线程设置为sleep,直到使用condition variable工作可用,并且在推送工作请求后网络代码调用notify_one()。
答案 1 :(得分:0)
另一个与你描述完全相同的技巧是设置一个截止时间计时器,它有一个无限期限,你可以在coro(屈服)中等待。
然后从GPU任务中取消工作完成的时间,恢复coro。
参见例如