【发布时间】:2020-01-25 14:30:29
【问题描述】:
Here 我想提供一个完整的测试用例,显示一个简单的 TBB parallel_for 构造导致 Python 应用程序死锁。 Python 前端使用 pybind11 与 TBB 后端相结合:
void backend_tbb(vector<int>& result, std::function<int (int)>& callback)
{
int nthreads = tbb::task_scheduler_init::default_num_threads();
const char* cnthreads = getenv("TBB_NUM_THREADS");
if (cnthreads) nthreads = std::max(1, atoi(cnthreads));
tbb::task_group group;
tbb::task_arena arena(nthreads, 1);
tbb::task_scheduler_init init(nthreads);
group.run( [&] {
tbb::parallel_for(tbb::blocked_range<int>(0, result.size()),
[&](const tbb::blocked_range<int>& range)
{
for (int i = range.begin(); i != range.end(); i++)
result[i] = callback(i);
});
});
arena.execute( [&] { group.wait(); });
}
void backend_serial(vector<int>& result, std::function<int (int)>& callback)
{
for (int i = 0; i < result.size(); i++)
result[i] = callback(i);
}
PYBIND11_MODULE(python_tbb, m)
{
pybind11::bind_vector<std::vector<int> >(m, "stdvectorint");
m.def("backend_tbb", &backend_tbb, "TBB backend");
m.def("backend_serial", &backend_serial, "Serial backend");
}
backend_tbb 未注释,应用程序无限死锁:
from python_tbb import *
import numpy as np
def callback(a) :
return int(a) * 10
def main() :
length = 10
result1 = stdvectorint(np.zeros(length, np.int32))
result2 = stdvectorint(np.zeros(length, np.int32))
backend_serial(result1, callback)
# XXX Uncomment this to get the program hang
#backend_tbb(result2, callback)
for i in range(length) :
print("%d vs %d" % (result1[i], result2[i]))
if __name__ == "__main__" :
main()
我试过gil_scoped_acquire/gil_scoped_release,但没有任何变化。据报道Similar solution 适用于 OpenMP 循环 - 但当我尝试对 TBB 做同样的事情时,再次没有运气。请对此案提出建议,谢谢!
【问题讨论】:
-
你可以读到here
tbb::blocked_range [i, j)不保证j>=i。您可以尝试用i < range.end()替换i != range.end()吗?也许你在那里运行一个无限循环。即使没有,那也绝对是一个危险。 -
实际上intel compares the same way you do 所以这不是答案。帮不了你,对不起...
-
@Nearoo 循环应该没问题,适用于单线程情况
-
当然,在单线程情况下
j>i总是正确的。但由于英特尔也是这样做的,所以这确实不太可能是问题所在。但是,您的论点使我认为您不完全理解代码的作用。你确定这是一个僵局吗?你使用调试器吗? -
另外,您的回购实际上只包含您在此处发布的内容。我已将您的问题标记为需要详细信息,因为您显然不明白我的建议是做什么的,并且可能根本不知道您在做什么
标签: python python-3.x tbb pybind11