【发布时间】:2016-09-09 18:49:48
【问题描述】:
让我们看看下面的代码:
tbb::blocked_range<int> range(0, a.rows);
uint64_t positive = tbb::parallel_reduce(range, 0, // <- initial value
[&](const tbb::blocked_range<int>& r, uint64_t v)->uint64_t {
for (int y = r.begin(); y < r.end(); ++y) {
auto rA = a[y], rB = b[y];
for (int x = 0; x < a.cols; ++x) {
auto A = rA[x], B = rB[x];
for (int l = y; l < a.rows; ++l) {
auto rAA = a[l], rBB = b[l];
for (int m = x; m < a.cols; ++m) {
if (l == y && m == x)
continue;
auto AA = rAA[m], BB = rBB[m];
if ((A == AA) && (B == BB))
v++; // <- value is changed
if ((A != AA) && (B != BB))
v++; // <- value is changed
}
}
}
}
return v;
}, [](uint64_t first, uint64_t second)->uint64_t {
std::cerr << first << ' + ' << second; // <- wrong values occur
return first+second;
}
);
这是一个并行reduce操作,初始值为0。然后,在每个并行计算中,基于初始值,我们向上计数(第一个lambda函数中的局部变量v)。第二个 lambda 函数聚合来自并行工作者的结果。
有趣的是,这段代码没有按预期工作。第二个 lambda 函数的输出将显示整数溢出导致的大量数字。
将第二行替换为:
uint64_t positive = tbb::parallel_reduce(range, (uint64_t)0, // <- initial value
现在我想知道。第一个 lambda (uint64_t v) 的定义不会强制执行这种强制转换吗?应该在 uint64_t 上运行的函数如何改为在 int 上运行?
编译器是 GCC 6。
【问题讨论】:
-
0是int... -
当然。但是参数
v是uint64_t。
标签: c++ lambda casting type-conversion