Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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# 我可以并行化小的10毫秒以下的任务吗?(如矩阵求逆)_C#_Java_Multithreading_Thread Priority - Fatal编程技术网

C# 我可以并行化小的10毫秒以下的任务吗?(如矩阵求逆)

C# 我可以并行化小的10毫秒以下的任务吗?(如矩阵求逆),c#,java,multithreading,thread-priority,C#,Java,Multithreading,Thread Priority,对于Windows和Linux上的线程(或光纤),在任何编程语言中,我都有一个一般性问题: 有没有可能让“第二个线程随时待命”,让它在几毫秒内快速启动并帮助完成一项小任务,而不被抢占先机? 我应该补充一点,我希望没有互斥锁和旋转锁的清晰代码 表示常规线程池对于小任务不起作用,考虑C语言中的矩阵求逆问题。 我用的是伊万·库克尔的。 我复制他的Invert函数,并将其称为InvertParallel,如下所示: public Matrix InvertParallel()//从Ivan的Invert

对于Windows和Linux上的线程(或光纤),在任何编程语言中,我都有一个一般性问题:

有没有可能让“第二个线程随时待命”,让它在几毫秒内快速启动并帮助完成一项小任务,而不被抢占先机? 我应该补充一点,我希望没有互斥锁和旋转锁的清晰代码

表示常规线程池对于小任务不起作用,考虑C语言中的矩阵求逆问题。 我用的是伊万·库克尔的。 我复制他的Invert函数,并将其称为InvertParallel,如下所示:

public Matrix InvertParallel()//从Ivan的Invert()修改而来,参见上面的链接
{
如果(L==null)MakeLU();
矩阵inv=新矩阵(行、列);
Parallel.ForEach(可枚举的.Range(0,行),rowID=>
{
矩阵Ei=矩阵零矩阵(行,1);
Ei[rowID,0]=1;
矩阵col=带(Ei)的解算器;
inv.SetCol(col,rowID);
});
退货库存;
}
然后调用Invert和Invert_并行函数并测量所需时间:

static void Main()
{
秒表sw=新秒表();sw.Start();
矩阵A=矩阵识别矩阵(50,50);
矩阵I1=A.逆变();
长elapsed1=sw.ElapsedMilliseconds;
矩阵I2=A.反向平行();
长elapsed2=sw.ElapsedMilliseconds-elapsed1;
Console.WriteLine(“矩阵大小=“+A.rows+”,Invert=“+elapsed1+”ms,Invert_Parallel=“+elapsed2+”ms”);
}
非常明显的结果表明,对于小任务(矩阵大小50),从线程池启动任务要比运行单线程慢:

Matrix size=50,  Invert=  5ms,  InvertParallel=21ms
Matrix size=100, Invert= 19ms,  InvertParallel=24ms
Matrix size=200, Invert=137ms,  InvertParallel=44ms
(抱歉-我必须删除下面备注中的所有链接,因为我是一张新海报)

附言:可能与S/O相关的文章:“如何同时启动两个线程”,“Linux-线程和进程调度优先级”

是的,我知道有一个更聪明的算法来计算倒数,它的比例是O(N^2.376)


p.p.S.我不熟悉用户模式调度(Windows上的UMS),这有帮助吗?

在线程之间传递任务,特别是那些具有大量相关数据的线程,其开销非常大,这可能会导致小任务的性能降低,如您所见。您需要找到使用多个核心更快的最佳点


顺便说一句,您可以通过制作一个工作线程,当前线程在缓存之间保存一个上下文切换和副本来获得一点改进。e、 g.如果您有8个内核,则传递1/7到7个其他线程,并在当前线程中执行1/8。

在线程之间传递任务,特别是那些具有大量相关数据的线程,会产生不小的开销,这会导致小任务的性能降低,如您所见。您需要找到使用多个核心更快的最佳点


顺便说一句,您可以通过制作一个工作线程,当前线程在缓存之间保存一个上下文切换和副本来获得一点改进。e、 g.如果您有8个内核,请传递1/7到7个其他线程,并在当前线程中执行1/8。

“我可以”-肯定。“我应该吗”-好问题。“我能”-当然。“我应该吗”-问得好。彼得-你能解释一下问题出在哪里吗?5毫秒对我来说似乎是一段非常、非常长的时间——比上下文切换之类的事情要长得多。在这种情况下,游泳池为什么会这么慢?它在21-5=16ms时做什么?在C#中对矩阵对象排队应该只是一个参考推送,是吗?这是怎么回事?为什么反转如此低效?在Java中,参考推送和上下文切换(唤醒线程)可能需要10微秒左右(在C#中也差不多)。从一个缓存到另一个缓存的数据推送取决于数据的大小,如果有足够的活动,可能需要毫秒。Peter是正确的。唤醒第二个线程非常快。上面代码的问题是我没有初始化线程池。如果你对线程池进行初始化,你会得到这样的结果:
Matrix size=50,Invert=5ms,Invert\u Parallel=2ms
Peter-你能解释一下问题出在哪里吗?5毫秒对我来说似乎是一段非常、非常长的时间——比上下文切换之类的事情要长得多。在这种情况下,游泳池为什么会这么慢?它在21-5=16ms时做什么?在C#中对矩阵对象排队应该只是一个参考推送,是吗?这是怎么回事?为什么反转如此低效?在Java中,参考推送和上下文切换(唤醒线程)可能需要10微秒左右(在C#中也差不多)。从一个缓存到另一个缓存的数据推送取决于数据的大小,如果有足够的活动,可能需要毫秒。Peter是正确的。唤醒第二个线程非常快。上面代码的问题是我没有初始化线程池。如果对线程池进行初始化,则会得到以下结果:
Matrix size=50,Invert=5ms,Invert\u Parallel=2ms