gpt4 book ai didi

c# - C#/C++ 中的同步并行进程

转载 作者:可可西里 更新时间:2023-11-01 16:01:18 27 4
gpt4 key购买 nike

我有一个包含数据的数组 x[]。还有一组“系统状态”c[]。过程:

for(i = 1; i < N; i++)
{
a = f1(x[i] + c[i-1]);
b = f2(x[i] + c[i-1]);
c[i] = a + b;
}

有没有什么有效的方法可以在使用 2 个并行线程的 2 核系统上找到 f1f2 的值?我的意思是(伪代码):

thread_1
{
for(i = 1; i < N; i++)
a = f1(x[i] + c[i-1]);
}
thread_2
{
for(i = 1; i < N; i++)
{
b = f2(x[i] + c[i-1]);
c[i] = a + b; //here we somehow get a{i} from thread_1
}
}

f1f2 并不耗时,但需要计算很多次,所以期望的加速比大约是 x2。请参阅图形表示图:

desired parallel process

寻找适用于 Windows 的代码示例。

最佳答案

如果我没理解错的话,

  • a[i]只有在c[i-1]可用时才能计算
  • b[i]只有在c[i-1]可用时才能计算
  • c[i]仅在计算a[i]b[i]时可用

这意味着您唯一可以单独执行的过程是计算a[i]b[i]

这就是我在 C# 中的看法:

for (int i = 1; i < N; i++)
{
Task<double> calcA = Task.Factory.StartNew(() => { return f1(x[i] + c[i-1]); });
Task<double> calcB = Task.Factory.StartNew(() => { return f2(x[i] + c[i-1]); });

// .Result will block the execution and wait for both calculations to complete
c[i] = calcA.Result + calcB.Result;
}

这将运行两个独立的线程,分别计算f1f2f1f2 计算完成后,设置c[i] 值,并运行下一次迭代。

注意:

  • 我使用 double,假设你的 f1f2 返回 double
  • 循环从 1 开始,假设您有一些初始 a[0]b[0] 值。否则,c[i-1] 会抛出异常
  • 只有当 f1f2 的计算与其他计算相比确实耗费资源且时间较长时,这才会带来改进
  • Task.Factory.StartNew(与使用 Thread 不同)使用 ThreadPool,这意味着它不会每次都创建一个新线程,而是重用池中的现有线程.它显着减少了开销。

关于c# - C#/C++ 中的同步并行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461220/

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