tbb parallel_reduce 用于减少 OpenMP 的片段
tbb parallel_reduce for a snippet of OpenMP reduction
我有以下 OpenMP 代码片段,我知道它可以正常工作。
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 代码中我可能做错了什么我得到了错误的结果吗?
parallel_reduce
的第二个参数 - blocked_range
之后的参数 - 应该是所用缩减操作的标识值。实现使用此值来初始化累加器。对于异或,标识值为 0。标识值的类型与结果的类型匹配也很重要。
所以,你的电话应该是
cipherChar ^= tbb::parallel_reduce(
tbb::blocked_range<int>(0, numKeys),
char(0), // <- identity for XOR
body_lambda,
reduction_lambda
);
我有以下 OpenMP 代码片段,我知道它可以正常工作。
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 代码中我可能做错了什么我得到了错误的结果吗?
parallel_reduce
的第二个参数 - blocked_range
之后的参数 - 应该是所用缩减操作的标识值。实现使用此值来初始化累加器。对于异或,标识值为 0。标识值的类型与结果的类型匹配也很重要。
所以,你的电话应该是
cipherChar ^= tbb::parallel_reduce(
tbb::blocked_range<int>(0, numKeys),
char(0), // <- identity for XOR
body_lambda,
reduction_lambda
);