TBB parallel_for 编译错误
TBB parallel_for compile error
我想使用 TBB parallel_for 我把这个放到我的代码中进行测试
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
#include <tbb/tbb.h>
std::vector<std::tuple<std::string, unsigned int, std::string>> commands;
auto n = commands.size();
tbb::parallel_for(0, n, [&](int i) {
const auto &tuple = commands[i];
} );
我的编译行是:
g++ -std=c++11 -Wall -Wextra -g -Og TextMiningApp.cpp -ltbb -o TextMiningApp
我的编译器错误是:
TextMiningApp.cpp: In function ‘int main(int, char**)’:
TextMiningApp.cpp:184:7: error: no matching function for call to ‘parallel_for(int, long unsigned int&, main(int, char**)::<lambda(int)>)’
} );
^
In file included from TextMiningApp.cpp:15:0:
/usr/include/tbb/parallel_for.h:185:6: note: candidate: template<class Range, class Body> void tbb::parallel_for(const Range&, const Body&)
void parallel_for( const Range&
^
你有解决这个问题的想法吗?
你的代码的问题是 0
是 int
类型,而 n
是 std::size_t
类型。存在不匹配,您需要进行转换。解决方法如下:
tbb::parallel_for(static_cast<std::size_t>(0), n, [&](std::size_t i)) {
// other code
}
另一个解决方案是使用tbb::blocked_range<T>
来指定范围,即tbb::parallel_for
的另一个重载。
tbb::parallel_for(tbb::blocked_range<std::size_t>(0, n),
[&](const tbb::blocked_range<std::size_t> &range) {
for (auto i = range.begin(); i != range.end(); ++i)
const auto &tuple = commands[i];
} );
显然,第一种方案更简洁。但是,第二个更灵活。因为对于第一个,你只能指定循环体,而对于第二个,你可以在循环体之外做更多。
我想使用 TBB parallel_for 我把这个放到我的代码中进行测试
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
#include <tbb/tbb.h>
std::vector<std::tuple<std::string, unsigned int, std::string>> commands;
auto n = commands.size();
tbb::parallel_for(0, n, [&](int i) {
const auto &tuple = commands[i];
} );
我的编译行是:
g++ -std=c++11 -Wall -Wextra -g -Og TextMiningApp.cpp -ltbb -o TextMiningApp
我的编译器错误是:
TextMiningApp.cpp: In function ‘int main(int, char**)’:
TextMiningApp.cpp:184:7: error: no matching function for call to ‘parallel_for(int, long unsigned int&, main(int, char**)::<lambda(int)>)’
} );
^
In file included from TextMiningApp.cpp:15:0:
/usr/include/tbb/parallel_for.h:185:6: note: candidate: template<class Range, class Body> void tbb::parallel_for(const Range&, const Body&)
void parallel_for( const Range&
^
你有解决这个问题的想法吗?
你的代码的问题是 0
是 int
类型,而 n
是 std::size_t
类型。存在不匹配,您需要进行转换。解决方法如下:
tbb::parallel_for(static_cast<std::size_t>(0), n, [&](std::size_t i)) {
// other code
}
另一个解决方案是使用tbb::blocked_range<T>
来指定范围,即tbb::parallel_for
的另一个重载。
tbb::parallel_for(tbb::blocked_range<std::size_t>(0, n),
[&](const tbb::blocked_range<std::size_t> &range) {
for (auto i = range.begin(); i != range.end(); ++i)
const auto &tuple = commands[i];
} );
显然,第一种方案更简洁。但是,第二个更灵活。因为对于第一个,你只能指定循环体,而对于第二个,你可以在循环体之外做更多。