Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多线程处理一系列方程_C_Multithreading_Sysbios - Fatal编程技术网

C 多线程处理一系列方程

C 多线程处理一系列方程,c,multithreading,sysbios,C,Multithreading,Sysbios,我有一个很长的方程组,看起来像这样,除了大约113个t: t1 = L1; t2 = L2 + 5; t3 = t2 + t1; t4 = L3 ... t113 = t3 + t4 return t113; 其中,L是输入参数 计算t113需要很长时间。所以我试图把它分成几个不同的线程,以使它更快。问题是我不知道怎么做。我试着用手在纸上画出一棵树的形状,这样我可以更好地分析它,但它在中途变得太大和笨拙了 还有其他方法可以加快计算速度吗?谢谢 编辑:我使用的是8核DSP和SYS/BIOS。根据

我有一个很长的方程组,看起来像这样,除了大约113个t:

t1 = L1;
t2 = L2 + 5;
t3 = t2 + t1;
t4 = L3
...
t113 = t3 + t4
return t113;
其中,
L
是输入参数

计算t113需要很长时间。所以我试图把它分成几个不同的线程,以使它更快。问题是我不知道怎么做。我试着用手在纸上画出一棵树的形状,这样我可以更好地分析它,但它在中途变得太大和笨拙了

还有其他方法可以加快计算速度吗?谢谢


编辑:我使用的是8核DSP和SYS/BIOS。根据我的前任,这些逆运动学方程和正运动学方程的处理时间最长。我的前任也有意选择了这个8核DSP作为实现的硬件。因此,我假设我应该以一种利用所有8个内核的方式编写代码。

对于依赖于其他值的值,您将很难将工作分配给不同的线程。然后,也可能有一个线程在等待另一个线程。启动新线程可能比只计算113个值更昂贵


你确定计算t113需要很长时间吗?或者是其他需要很长时间的事情。

如果所有的赋值都像您显示的那样简单,那么一个合理的编译器会很好地减少它。对于你展示的部分

return L1 + L2 + L3 + 5, should be all the work it's doing.
也许这可以在两个线程(在两个CPU上)中完成,如:


但是,只有113个加法——如果它们是这样的话——而且现代计算机非常擅长加法,可能不会“更快”。我假设这些任务是时间密集型的,而不仅仅是
L2+L3
之类的任务。如果不是这样,线程中的开销将大大超过线程中的任何最小收益

如果这是Java,那么我将使用
Executors.newCachedThreadPool()
在需要时启动一个新线程,然后允许作业本身将作业提交到线程池并等待响应。这是一个有点奇怪的模式,但它会工作

例如:

private final ExecutorService threadPool = Executors.newCachedThreadPool();
...
public class T3 implements Callable<Double> {
    public Double call() throws Exception {
        Future<Double> t2 = threadPool.submit(new T2());
        Future<Double> t1 = threadPool.submit(new T1());
        return t2.get() + t1.get();
    }
}
private final ExecutorService threadPool=Executors.newCachedThreadPool();
...
公共类T3实现了可调用{
public Double call()引发异常{
Future t2=threadPool.submit(新t2());
Future t1=threadPool.submit(new t1());
返回t2.get()+t1.get();
}
}
最后的任务是:

Future<Double> t3 = threadPool.submit(new T3());
// this throws some exceptions that need to be caught
double result = t3.get();
threadPool.shutdown();
Future t3=threadPool.submit(新t3());
//这会抛出一些需要捕获的异常
双重结果=t3.get();
threadPool.shutdown();
然后线程池将只处理结果。它将尽可能多地进行并行化。现在,如果在多个位置使用
T1
任务的输出,这将不起作用


如果这是另一种语言,根据可用的线程库,可能可以使用类似的模式。

您的简单示例将使用Excel多线程计算自动执行多线程(并优化解决方案路径)。

但是您没有给出足够的细节来说明这对于您的实际应用程序是否是一种明智的方法。

如果您想在某种语言下使用此方法,请添加语言说明符。您想在多个CPU上运行它吗?否则,我无法想象为什么使用更多线程时速度会更快……方程式的模式不是很清楚。是不是每个t(n)都可以是t(n-1),t(n-2)的线性组合。。。t(1)?除非你能确定可以同时进行的具体计算,就像你知道的t2和t1都需要很长时间,否则线程在这里不会有多大帮助。然而,如果这种模式成立,线程可能会有很大帮助。我使用C。是的,我在几个CPU上运行它。据我所知,这个巨大的方程式没有明确的模式。我的部分挑战是试图确定可能同时发生的特定计算,但我尝试在没有工具的情况下对其进行分析,这一点相当不清楚。我希望使用类似于Excel的东西,但相信在我使用的操作系统(Sys/BIOS)上无法使用。您应该建议使用ForkJoin!你应该。我还没有兼容Java 7@JohnVint.:-)+1尽管如此,您对解决方案的看法是正确的。我会跳到Java8,因为它有很多很酷的新并发特性+FJ
Future<Double> t3 = threadPool.submit(new T3());
// this throws some exceptions that need to be caught
double result = t3.get();
threadPool.shutdown();