C++:如何在同一范围内多次使用 parallel-for 宏?
C++: how can I use parallel-for macro multiple times in same scope?
我在 运行 代码块中使用局部函数定义 N 次,就像 C# 的并行版本一样,但是当我使用两个时它给出了 f
函数的多重定义错误或相同范围内的更多。如何在同一范围内每次使用后逐步更改函数名称,例如 f1、f2、f3、..?
定义:
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O) \
struct LocalClass \
{ \
void operator()(int i) const O \
} f; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
用法:
PARALLEL_FOR(
5,
{std::cout<<100*i<<std::endl;}
);
输出:
0
300
200
100
400
通常添加 {\
和 }\
会解决后续调用,但如果我嵌套并行怎么办?
虽然这对我来说似乎不是理想的解决方案,但您可以使用 ##
在宏中连接字符串。在您的代码中执行以下操作
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O,usageInd) \
struct LocalClass##usageInd \
{ \
void operator()(int i) const O \
} f##usageInd; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f##usageInd,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
现在由您为每次使用传递一个索引。
您可以使用 __LINE__
.
而不是传递唯一 ID
但是为什么不使用带有 lambda 的函数而不是丑陋的宏呢?
template <int N, class F>
void parallel_for(F f) {
std::thread threads[N]; // or std::array<std::thread, N> threads;
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI]=std::thread(f,loopCounterI);
}
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI].join();
}
}
这样使用:
parallel_for<5>([] (int i) {
std::cout<<100*i<<std::endl;
});
lambda可以捕获你需要的变量:
int j = ...;
parallel_for<5>([j] (int i) {
std::cout<<100*(i+j)<<std::endl;
});
我在 运行 代码块中使用局部函数定义 N 次,就像 C# 的并行版本一样,但是当我使用两个时它给出了 f
函数的多重定义错误或相同范围内的更多。如何在同一范围内每次使用后逐步更改函数名称,例如 f1、f2、f3、..?
定义:
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O) \
struct LocalClass \
{ \
void operator()(int i) const O \
} f; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
用法:
PARALLEL_FOR(
5,
{std::cout<<100*i<<std::endl;}
);
输出:
0
300
200
100
400
通常添加 {\
和 }\
会解决后续调用,但如果我嵌套并行怎么办?
虽然这对我来说似乎不是理想的解决方案,但您可以使用 ##
在宏中连接字符串。在您的代码中执行以下操作
#ifndef PARALLEL_FOR
#define PARALLEL_FOR(N,O,usageInd) \
struct LocalClass##usageInd \
{ \
void operator()(int i) const O \
} f##usageInd; \
std::thread threads[N]; \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI]=std::thread(f##usageInd,loopCounterI); \
} \
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) \
{ \
threads[loopCounterI].join(); \
} \
#endif
现在由您为每次使用传递一个索引。
您可以使用 __LINE__
.
但是为什么不使用带有 lambda 的函数而不是丑陋的宏呢?
template <int N, class F>
void parallel_for(F f) {
std::thread threads[N]; // or std::array<std::thread, N> threads;
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI]=std::thread(f,loopCounterI);
}
for(int loopCounterI=0; loopCounterI<N; loopCounterI++) {
threads[loopCounterI].join();
}
}
这样使用:
parallel_for<5>([] (int i) {
std::cout<<100*i<<std::endl;
});
lambda可以捕获你需要的变量:
int j = ...;
parallel_for<5>([j] (int i) {
std::cout<<100*(i+j)<<std::endl;
});