【问题标题】:tbb parallel_reduce for a snippet of OpenMP reductiontbb parallel_reduce 用于 OpenMP 缩减的片段
【发布时间】:2017-05-19 20:34:55
【问题描述】:

我知道以下 OpenMP 代码 sn-p 可以正常工作。

char cipherChar=plainText[charLoop];
#pragma omp parallel for reduction(^:cipherChar)
for(keyLoop=0;keyLoop<numKeys;keyLoop++) {
    cipherChar = cipherChar ^ getBit( &(keyList[keyLoop]), charLoop);
}
cypherText[charLoop]=cipherChar;

但是当我尝试在 tbb 中编写这段代码时,我没有得到正确的输出

char cipherChar=plainText[charLoop];
cipherChar ^= tbb::parallel_reduce(tbb::blocked_range<int>(0, numKeys), cipherChar,
[&](const tbb::blocked_range<int>& r, char c) -> char {
            char result = c;
            for(int i = r.begin(); i <= r.end(); i++) {
                    result ^= getBit( &(keyList[i]), charLoop);
            }
            return result;
    },

    [](char a, char b) {
            return a ^ b;
    }
);
cypherText[charLoop]=cipherChar;

谁能告诉我我在上面的 tbb 代码中可能做错了什么,我得到了错误的结果?

【问题讨论】:

  • i &lt;= r.end() 应该是i &lt; r.end()
  • 奇怪的是,修复后我仍然得到相同的错误输出。

标签: c++ c++11 openmp intel tbb


【解决方案1】:

parallel_reduce 的第二个参数——blocked_range 后面的一个——应该是所用归约操作的标识值。实现使用此值来初始化累加器。对于异或,标识值为 0。标识值的类型与结果的类型相匹配也很重要。

所以,你的电话应该是

cipherChar ^= tbb::parallel_reduce(
    tbb::blocked_range<int>(0, numKeys),
    char(0), // <- identity for XOR
    body_lambda,
    reduction_lambda
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多