gpt4 book ai didi

C++11并行实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:50 26 4
gpt4 key购买 nike

首先我做了一个线程池,并尝试对一个大小为 40960 个浮点元素的数组进行一些繁重的算术运算。

单线程方法得到 0.0009 秒的结果,而 4 个线程同步运行的并行方法得到 0.0003 秒。在这个实现中,我手动将任务分配到 4 个部分,并将它们排队到线程池中。

现在我想为我的线程池提供一个通用方法parfor。我试过这个:

    void parfor(int begin, int end, std::function<void(int)>func)
{
int delta = (end - begin) / M_count;
for (int i = 0; i < M_count; ++i)
queue([=]{
int localbegin = begin + i*delta;
int localend = (i == M_count - 1) ? end : localbegin + delta;
for (int it = localbegin; it < localend; ++it)
func(it);
});
wait();
}

其中 M_count 是线程数。执行时间变为 0.003 秒(大约是手动分配作业的 10 倍)。我猜 std::function 有很大的运行时开销,但不知道任何其他替代方法。你能给我一些建议吗?非常感谢。

编辑:根据 Rapptz 的建议,我尝试了这个:

template <typename Function>
void parfor(int begin, int end, Function)

然后像这样使用它:

pool.parfor(0, 40960, [&](int i){
buff[i] = pow5(buff[i]);
});

它显示了一些错误:

error C2371: 'it' : redefinition; different basic types 
error C2512: 'wmain::<lambda_badf06dfbebc4bb15b3ade2b922c7f76>' : no appropriate default constructor available

我认为它将 lambda 视为一种类型,但不知道如何解决...

最佳答案

(评论太多...)这只是解释如何实现 Rapptz 的建议,即使用模板参数来指定函数(因此可以内联)。

考虑以下代码:

#include <iostream>

void f(int n) { std::cout << "f(" << n << ");\n"; }
void g(int n) { std::cout << "g(" << n << ");\n"; }

template <typename Function>
void t(Function function, int n)
{
static int x;
std::cout << "&x " << &x << '\n';
function(n);
}

struct FuncF { static void f(int n) { std::cout << "Ff(" << n << ");\n"; } };
struct FuncG { static void f(int n) { std::cout << "Gf(" << n << ");\n"; } };

template <typename Function>
void ft(int n)
{
static int x;
std::cout << "&x " << &x << '\n';
Function::f(n);
}

int main()
{
t(f, 42);
t(g, 42);

ft<FuncF>(42);
ft<FuncG>(42);
}

这会打印出如下内容:

&x 00421760
f(42);
&x 00421760
g(42);
&x 00421764
Ff(42);
&x 00421768
Gf(42);

请注意,前两个为 x 打印相同的地址...这是因为只需要模板的一个实例化,因为两个调用的函数类型相同。 ft 模板使用模板参数访问函数,而不涉及运行时函数参数,因此有两个实例化为本地静态 x 产生不同的地址。

要使您的函数调用内联,您应该采用类似于 FuncF/FuncGft 的方法。

关于C++11并行实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com