提交 8a6f1475 编写于 作者: L luohang

[xpu] add XPU_L3_LOCK_REQUIRED to support multi-process run

test=develop test=xpu
上级 27150a06
......@@ -23,6 +23,9 @@
#ifdef LITE_WITH_PRECISION_PROFILE
#include "lite/core/profile/precision_profiler.h"
#endif
#ifdef LITE_WITH_XPU
#include <fcntl.h>
#endif
namespace paddle {
namespace lite {
......@@ -439,7 +442,44 @@ void Instruction::Run() {
CHECK(op_->CheckShape());
}
if (op_->run_once() && has_run_) {
#ifdef LITE_WITH_XPU
static int reentrant = 0;
int xpu_l3_lock_fd;
auto need_lock_l3 = std::getenv("XPU_L3_LOCK_REQUIRED");
struct flock f_lock;
f_lock.l_whence = 0;
f_lock.l_len = 0;
if (reentrant == 0) {
if (need_lock_l3) {
int pd = 0; // TODO(luohang): need get from lite api
std::string buf = "/opt/xpu_lock" + std::to_string(pd);
xpu_l3_lock_fd = open(buf.c_str(), O_RDWR);
CHECK(xpu_l3_lock_fd > 0) << "open " << buf
<< " failed: " << xpu_l3_lock_fd;
// lock
f_lock.l_type = F_WRLCK;
fcntl(xpu_l3_lock_fd, F_SETLKW, &f_lock);
} else {
xpu_l3_lock_fd = -1;
}
}
reentrant++;
#endif
bool run_res = op_->run_once() && has_run_;
#ifdef LITE_WITH_XPU
if (need_lock_l3 && reentrant == 1) {
f_lock.l_type = F_UNLCK;
fcntl(xpu_l3_lock_fd, F_SETLKW, &f_lock);
close(xpu_l3_lock_fd);
}
reentrant--;
#endif
if (run_res) {
return;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册