VSC 可提供简单的模板,用于应用代码开发和管理对加速器硬件的软件调用。此模板可提供统一样式用于创建 C++ 软件 API,与硬件组合无关。
auto arg1BP = myACC::create_bufpool( .... ); (1)
....
myACC::send_while([= .... ]() // (2)
{
int* arg1 = myAcc::alloc_buf<int>(arg1BP, .... ); // (4)
....
myACC::compute( arg1, .... ); // (5)
....
return ( while_cond ); // (3)
}
myACC::receive_all_in_order([= .... ]() // (6)
{
....
}
myACC::join(); // (7)
以上伪代码中所示此模板结构分以下几个部分。请参阅 VPP_ACC 类 API 以获取有关这些元素的详细信息。
-
create_bufpool()
:为传递给加速器的每个指针实参创建一个缓冲池,并提供实参数据规范(例如,输入、输出和远程)。 -
send_while()
:该作业用于控制加速器上的作业的整体调度,使用 lambda 函数来为每项作业提供数据。 -
return ( while_cond );
:lambda 函数体在循环内执行,必须返回布尔值。send_while
主体内的return
语句允许用户持续运行循环,前提是返回的值为 true,并且当返回的值为 false 时,停止循环并退出send_while
线程。如果在声明和使用 lambda 函数前,sent_value
已设为 0,那么return
语句可以是 (++sent_value<MAX_SEND
)。 -
alloc_buf()
:为当前循环迭代分配来自缓冲池的存储器缓冲器对象。 -
compute()
:软件调用,用于在加速器硬件上调度compute()
函数的一次作业执行。 -
receive_all_in_order()
:此线程等待来自调度的作业的结果。这是另一个用户定义的 lambda 函数,只要send_while()
线程运行,即可保持在循环内执行。 -
join()
:等待发送和接收线程完成。
以下各章节提供了有关创建应用代码的更多详细信息。