当前位置:编程学习 > C#/ASP.NET >>

【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

--------------------编程问答-------------------- 感谢分享,帮你推荐下。 --------------------编程问答-------------------- 感谢caozhy,虽然我们之前闹过矛盾。 --------------------编程问答--------------------
引用 楼主 laviewpbt 的回复:
     在单核时代,多线程程序的主要目的是防止UI假死,而一般情况下此时多线程程序的性能会比单线程的慢,这种情况五六年前是比较普遍的,所有哪个时候用VB6写的图像程序可能比VC6的慢不了多少。
 


vb6是根本不支持线程的,只支持默认的sta线程切换模型,睁着眼睛骗外行时才会说“vb6是因为采用了多线程所以比vc6慢”。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 3 楼 sp1234 的回复:
Quote: 引用 楼主 laviewpbt 的回复:

     在单核时代,多线程程序的主要目的是防止UI假死,而一般情况下此时多线程程序的性能会比单线程的慢,这种情况五六年前是比较普遍的,所有哪个时候用VB6写的图像程序可能比VC6的慢不了多少。
 


vb6是根本不支持线程的,只支持默认的sta线程切换模型,睁着眼睛骗外行时才会说“vb6是因为采用了多线程所以比vc6慢”。


我不懂sp1234的意思,是讽刺我还是什么,我没说这个话的 "vb6是因为采用了多线程所以比vc6慢;

--------------------编程问答-------------------- 在单核时代,多线程是不是只是让界面响应流畅以外毫无作用呢?

其实不是,多线程一样可以带来性能的增益。一个最明显的例子是网络下载。这是一个通过并发(我们往往管CPU的并发叫并行,其实我倒是觉得没有必要严格区分这两个词)实现IO延迟隐藏(网络传输也可以视作是IO延迟)的经典例子。 --------------------编程问答-------------------- 而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

15年前vb6和vc6程序员如何编程,跟当时使用什么“多线程”没有关系。 --------------------编程问答-------------------- 另外,和GPU相比,CPU的计算能力太小儿科了。
Core i7的运算能力才50Gflops
而现在一块中低端的GTX660,运算能力都超过了1.5T(1500Gflops),是CPU的30倍以上。

而且图像是天然地适合GPU运算的东西。

推荐lz研究下GPU的加速。

比如Cudafy http://www.codeproject.com/Articles/202792/Using-Cudafy-for-GPGPU-Programming-in-NET --------------------编程问答-------------------- 论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。 


sp1234我对多线程的理解还很原始,我那段话的意思很多也是我的臆想,我原本的意思就是:  在单核的情况下,对于图像的算法本身,用多线程去实现,仅仅从速度上考虑,应该不会有提高。那么这样同一样一个算法,由于VB6的程序一般都是单线程的,速度上也就不会比VC差多少,即使VC是使用多线程编码的。 但是这种情况在多核的机器下就不同了。



--------------------编程问答--------------------
引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。 


sp1234我对多线程的理解还很原始,我那段话的意思很多也是我的臆想,我原本的意思就是:  在单核的情况下,对于图像的算法本身,用多线程去实现,仅仅从速度上考虑,应该不会有提高。那么这样同一样一个算法,由于VB6的程序一般都是单线程的,速度上也就不会比VC差多少,即使VC是使用多线程编码的。 但是这种情况在多核的机器下就不同了。

呵呵,我也是天天在csdn,都是在讨论技术,有瑕疵人家才会有挑剔,我喜欢 --------------------编程问答-------------------- --------------------编程问答-------------------- very good --------------------编程问答-------------------- 感谢楼主分享,学习! --------------------编程问答-------------------- 收下了!感觉分享! --------------------编程问答-------------------- 好东西 --------------------编程问答-------------------- 感谢分享!Thanks! --------------------编程问答-------------------- 不错  感谢分享!Thanks! --------------------编程问答-------------------- --------------------编程问答-------------------- 我要是也会C#就好了 --------------------编程问答-------------------- 感谢分享,学习了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 感谢分享,学习了。  --------------------编程问答-------------------- 多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。 --------------------编程问答-------------------- very very good  --------------------编程问答-------------------- --------------------编程问答-------------------- 不错 --------------------编程问答-------------------- 参考借鉴 --------------------编程问答-------------------- 参考     呵呵呵     --------------------编程问答-------------------- 楼主 我想问你在C#中我想获取系统当前时间的小时和分钟(08:58:00)怎么获取啊?: --------------------编程问答-------------------- learning --------------------编程问答-------------------- 不错  感谢分享!Thanks!  --------------------编程问答--------------------
引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。 


sp1234我对多线程的理解还很原始,我那段话的意思很多也是我的臆想,我原本的意思就是:  在单核的情况下,对于图像的算法本身,用多线程去实现,仅仅从速度上考虑,应该不会有提高。那么这样同一样一个算法,由于VB6的程序一般都是单线程的,速度上也就不会比VC差多少,即使VC是使用多线程编码的。 但是这种情况在多核的机器下就不同了。
哎呀,太感同身受了,这个sp1234,光看他那个头像就够让人恶心了,而且论坛里到处都是他这个头像,最让人受不了的是他每次留言都是一副说教人的样子,自己技术可能是牛逼点吧,也用不着到处说别人吧,反正这个人超级恶心的,头像代表一切~~ --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
感谢分享,帮你推荐下。
支持 --------------------编程问答-------------------- 来学习参考了  感谢分享 --------------------编程问答--------------------
引用 23 楼 zanfeng 的回复:
多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。 --------------------编程问答-------------------- 大牛要有大牛的风范,别老摆出一副臭架子的样子比较好。 --------------------编程问答-------------------- 每天回帖即可获得10分可用分!谢谢楼主的用心分享!!! --------------------编程问答-------------------- 受教了,感谢楼主指点~~~~~~~~~~ --------------------编程问答-------------------- 顶。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 看看技术部分,其他过滤 --------------------编程问答-------------------- LZ使用的并行方法,不是多线程
正如有人所说,并行可以说是GPU的天下,若是想把图像处理效率有数量级的提高,
GPU则是很好的武器
NVIDIA的的CUDA可以看下,
以前做医疗影像的时候,算法部的同事,将灌注的同一算法移植到GPU上,效率提高了5倍,而且还是在没有怎么优化的情况下 --------------------编程问答-------------------- 看见SP1234在这里自说自话就烦。 --------------------编程问答-------------------- 现在好多人都在挖掘GPU并行的潜力  效率一般都会增加6倍以上 --------------------编程问答-------------------- --------------------编程问答-------------------- 支持一下  --------------------编程问答--------------------
引用 42 楼 youaway 的回复:
看见SP1234在这里自说自话就烦。
哈哈,顶一个~~~他老是一副说教的样子,很烦 --------------------编程问答--------------------
引用 7 楼 sp1234 的回复:
而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

15年前vb6和vc6程序员如何编程,跟当时使用什么“多线程”没有关系。

能说点和主题相关的东西不? --------------------编程问答-------------------- GPU的编程方式和CPU好像有很大的差别。国内号称有个全球第一款基于GPU 加速的全功能图片处理软件 Musemage ,处理的速度确实非常不错。

不过有些无法并行的算法还是得靠CPU来实现的。  --------------------编程问答-------------------- 虽然看不懂,还是来顶一下 --------------------编程问答--------------------
引用 2 楼 laviewpbt 的回复:
感谢caozhy,虽然我们之前闹过矛盾。



呵呵! --------------------编程问答-------------------- 火药味十足啊 --------------------编程问答--------------------
引用 35 楼 yuwenge 的回复:
Quote: 引用 23 楼 zanfeng 的回复:

多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。


我上面的说法可能也不会。并行与多线程可能就是两个互相独立的两个东西。
--------------------编程问答--------------------
引用 52 楼 zanfeng 的回复:
Quote: 引用 35 楼 yuwenge 的回复:

Quote: 引用 23 楼 zanfeng 的回复:

多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。


我上面的说法可能也不会。并行与多线程可能就是两个互相独立的两个东西。


这本书我上大学的时候看过,amdahl定律被叫做悲观定律,后面还有一个乐观定律,就是并行计算可以大大扩展运算的规模,结果是,串行的部分在运算中的占比随规模的扩大会越发无足轻重,因此总体说来,并行计算可以无限提高计算性能。 --------------------编程问答-------------------- 看书主要是看思想方法,而不是具体的知识。

比如这个悲观定律和乐观定律,对我的思考问题的方式就有很大的启发。

比如说,C#和C++比,好在哪里这个问题。之前我的思维方式局限在,解决某个具体的问题,C#能做,C++也能做,只是麻烦一点。似乎好像语言只是一个工具。

但是如果你有了另一个视角,再看这个问题,就不一样了:人类的思维规模是一定的。如果一个程序过于庞大,那么再给它添加更多的东西,去思考、理解、实现和维护它都会成倍地困难——即使增加人手也一样。那么,解决相同的问题,一种抽象程度较高的语言需要的思维规模就较小,因此用C#可以编写出比C++在问题复杂性上更高,或者说规模更大的程序。虽然在理论上,你可以把这样一个程序用C++乃至机器语言改写,但是它的成本、时间已经是你远远不能承受而只是理论上的事情了。

这就是什么事情C#可以做而C++不可以做的答案。 --------------------编程问答--------------------
引用 54 楼 caozhy 的回复:
看书主要是看思想方法,而不是具体的知识。

比如这个悲观定律和乐观定律,对我的思考问题的方式就有很大的启发。

比如说,C#和C++比,好在哪里这个问题。之前我的思维方式局限在,解决某个具体的问题,C#能做,C++也能做,只是麻烦一点。似乎好像语言只是一个工具。

但是如果你有了另一个视角,再看这个问题,就不一样了:人类的思维规模是一定的。如果一个程序过于庞大,那么再给它添加更多的东西,去思考、理解、实现和维护它都会成倍地困难——即使增加人手也一样。那么,解决相同的问题,一种抽象程度较高的语言需要的思维规模就较小,因此用C#可以编写出比C++在问题复杂性上更高,或者说规模更大的程序。虽然在理论上,你可以把这样一个程序用C++乃至机器语言改写,但是它的成本、时间已经是你远远不能承受而只是理论上的事情了。

这就是什么事情C#可以做而C++不可以做的答案。


举个不是理论的例子来看看。 --------------------编程问答--------------------
引用 55 楼 ADF1230 的回复:
Quote: 引用 54 楼 caozhy 的回复:

看书主要是看思想方法,而不是具体的知识。

比如这个悲观定律和乐观定律,对我的思考问题的方式就有很大的启发。

比如说,C#和C++比,好在哪里这个问题。之前我的思维方式局限在,解决某个具体的问题,C#能做,C++也能做,只是麻烦一点。似乎好像语言只是一个工具。

但是如果你有了另一个视角,再看这个问题,就不一样了:人类的思维规模是一定的。如果一个程序过于庞大,那么再给它添加更多的东西,去思考、理解、实现和维护它都会成倍地困难——即使增加人手也一样。那么,解决相同的问题,一种抽象程度较高的语言需要的思维规模就较小,因此用C#可以编写出比C++在问题复杂性上更高,或者说规模更大的程序。虽然在理论上,你可以把这样一个程序用C++乃至机器语言改写,但是它的成本、时间已经是你远远不能承受而只是理论上的事情了。

这就是什么事情C#可以做而C++不可以做的答案。


举个不是理论的例子来看看。

用纯c++去写一个csdn网站试试。 --------------------编程问答--------------------
引用 52 楼 zanfeng 的回复:
Quote: 引用 35 楼 yuwenge 的回复:

Quote: 引用 23 楼 zanfeng 的回复:

多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。


我上面的说法可能也不会。并行与多线程可能就是两个互相独立的两个东西。

我记得我读书的时候是如是理解,并行是需要真正意义上同一时多通道刻执行同一任务。而线程可以看做是一个并发,看起来像是同一时刻执行多任务,但是在执行单元小于线程数的时候,同一时刻执行的任务数只有执行单元的数量。 --------------------编程问答--------------------
引用 56 楼 yuwenge 的回复:
Quote: 引用 55 楼 ADF1230 的回复:

Quote: 引用 54 楼 caozhy 的回复:

看书主要是看思想方法,而不是具体的知识。

比如这个悲观定律和乐观定律,对我的思考问题的方式就有很大的启发。

比如说,C#和C++比,好在哪里这个问题。之前我的思维方式局限在,解决某个具体的问题,C#能做,C++也能做,只是麻烦一点。似乎好像语言只是一个工具。

但是如果你有了另一个视角,再看这个问题,就不一样了:人类的思维规模是一定的。如果一个程序过于庞大,那么再给它添加更多的东西,去思考、理解、实现和维护它都会成倍地困难——即使增加人手也一样。那么,解决相同的问题,一种抽象程度较高的语言需要的思维规模就较小,因此用C#可以编写出比C++在问题复杂性上更高,或者说规模更大的程序。虽然在理论上,你可以把这样一个程序用C++乃至机器语言改写,但是它的成本、时间已经是你远远不能承受而只是理论上的事情了。

这就是什么事情C#可以做而C++不可以做的答案。


举个不是理论的例子来看看。

用纯c++去写一个csdn网站试试。


CSDN好复杂! --------------------编程问答--------------------
引用 57 楼 yuwenge 的回复:
Quote: 引用 52 楼 zanfeng 的回复:

Quote: 引用 35 楼 yuwenge 的回复:

Quote: 引用 23 楼 zanfeng 的回复:

多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。


我上面的说法可能也不会。并行与多线程可能就是两个互相独立的两个东西。

我记得我读书的时候是如是理解,并行是需要真正意义上同一时多通道刻执行同一任务。而线程可以看做是一个并发,看起来像是同一时刻执行多任务,但是在执行单元小于线程数的时候,同一时刻执行的任务数只有执行单元的数量。


我举个例子不知道对不对啊。
int a,b;
a=0;b=100;
for(int i=0;i<100;i++)//A cpu计算

   a=a+1;  //A cpu计算
   b=b+100;//B cpu计算 这个地方可以交给另一个CPU计算。
}
a和b互相计算互不干涉。如果有两个cpu就可以单独计算。
多线程呢相当于
第一个线程只是执行A的。  两个上下文这个可以交给A cpu来计算
for(int i=0;i<100;i++)

   a=a+1;
}
第二个线程只是执行B的。  两个上下文这个可以交给B cpu来计算
for(int i=0;i<100;i++)

   b=b+100;
} --------------------编程问答--------------------
引用 58 楼 ADF1230 的回复:
Quote: 引用 56 楼 yuwenge 的回复:

Quote: 引用 55 楼 ADF1230 的回复:

Quote: 引用 54 楼 caozhy 的回复:

看书主要是看思想方法,而不是具体的知识。

比如这个悲观定律和乐观定律,对我的思考问题的方式就有很大的启发。

比如说,C#和C++比,好在哪里这个问题。之前我的思维方式局限在,解决某个具体的问题,C#能做,C++也能做,只是麻烦一点。似乎好像语言只是一个工具。

但是如果你有了另一个视角,再看这个问题,就不一样了:人类的思维规模是一定的。如果一个程序过于庞大,那么再给它添加更多的东西,去思考、理解、实现和维护它都会成倍地困难——即使增加人手也一样。那么,解决相同的问题,一种抽象程度较高的语言需要的思维规模就较小,因此用C#可以编写出比C++在问题复杂性上更高,或者说规模更大的程序。虽然在理论上,你可以把这样一个程序用C++乃至机器语言改写,但是它的成本、时间已经是你远远不能承受而只是理论上的事情了。

这就是什么事情C#可以做而C++不可以做的答案。


举个不是理论的例子来看看。

用纯c++去写一个csdn网站试试。


CSDN好复杂!



尺有所短寸有所长。 --------------------编程问答-------------------- 初涉
除了处理图像,是否能举起他的并行处理实例?如数据表或什么的? --------------------编程问答-------------------- ( ・ิω・ิ)  咦 --------------------编程问答-------------------- 国庆慢慢看. --------------------编程问答-------------------- 支持一下,谢谢分享。。。。。。。。。。。 --------------------编程问答--------------------
引用 46 楼 imtns59521 的回复:
Quote: 引用 42 楼 youaway 的回复:

看见SP1234在这里自说自话就烦。
哈哈,顶一个~~~他老是一副说教的样子,很烦


最搞笑经常都没有看清楚人家说什么就开喷啊,明显楼主的意思他都理解错了
而且他自己也经常说错话啊。。。。 --------------------编程问答-------------------- 战略性马克,蛮有意思的帖子 --------------------编程问答-------------------- 感谢分享 --------------------编程问答-------------------- 我觉得 各取所长  一个项目分成很多小模块  哪个模块使用哪种语言更适合   就用哪种语音

到最后在计算机眼里 无非都是一样的东西

--------------------编程问答-------------------- 这种图片处理调用c++吧..才是王道.. --------------------编程问答--------------------
引用 59 楼 zanfeng 的回复:
Quote: 引用 57 楼 yuwenge 的回复:

Quote: 引用 52 楼 zanfeng 的回复:

Quote: 引用 35 楼 yuwenge 的回复:

Quote: 引用 23 楼 zanfeng 的回复:

多线程与并行好象不能划等号的吧。并行可能用了多线程的东东。但两个应该不是一个东西吧。

请教下到底什么是并行。


我上面的说法可能也不会。并行与多线程可能就是两个互相独立的两个东西。

我记得我读书的时候是如是理解,并行是需要真正意义上同一时多通道刻执行同一任务。而线程可以看做是一个并发,看起来像是同一时刻执行多任务,但是在执行单元小于线程数的时候,同一时刻执行的任务数只有执行单元的数量。


我举个例子不知道对不对啊。
int a,b;
a=0;b=100;
for(int i=0;i<100;i++)//A cpu计算

   a=a+1;  //A cpu计算
   b=b+100;//B cpu计算 这个地方可以交给另一个CPU计算。
}
a和b互相计算互不干涉。如果有两个cpu就可以单独计算。
多线程呢相当于
第一个线程只是执行A的。  两个上下文这个可以交给A cpu来计算
for(int i=0;i<100;i++)

   a=a+1;
}
第二个线程只是执行B的。  两个上下文这个可以交给B cpu来计算
for(int i=0;i<100;i++)

   b=b+100;
}


你说的第一个叫指令级并行(ILP),第二个叫线程级并行(TLP)。注意,如果不使用线程,是不会将计算分摊到多个处理器上的——在两个不同的处理器上同步的开销远远大于指令并行带来的性能增益。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- 来拿个分 --------------------编程问答-------------------- 菜鸟 没看懂不过顶下 --------------------编程问答-------------------- 谢谢楼主  感谢 --------------------编程问答-------------------- 路过不错过 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 我们实验室都是用VS2010在GPU上跑,速度确实很快。。。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- 不错,支持,很好的软件 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 感谢分享,学习了。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 41 楼 wodegege10 的回复:
LZ使用的并行方法,不是多线程
正如有人所说,并行可以说是GPU的天下,若是想把图像处理效率有数量级的提高,
GPU则是很好的武器
NVIDIA的的CUDA可以看下,
以前做医疗影像的时候,算法部的同事,将灌注的同一算法移植到GPU上,效率提高了5倍,而且还是在没有怎么优化的情况下

除了CUDA,还有一个叫什么来着,一下子想不起来了? --------------------编程问答--------------------
引用 32 楼 imtns 的回复:
Quote: 引用 9 楼 laviewpbt 的回复:

论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。 


sp1234我对多线程的理解还很原始,我那段话的意思很多也是我的臆想,我原本的意思就是:  在单核的情况下,对于图像的算法本身,用多线程去实现,仅仅从速度上考虑,应该不会有提高。那么这样同一样一个算法,由于VB6的程序一般都是单线程的,速度上也就不会比VC差多少,即使VC是使用多线程编码的。 但是这种情况在多核的机器下就不同了。
哎呀,太感同身受了,这个sp1234,光看他那个头像就够让人恶心了,而且论坛里到处都是他这个头像,最让人受不了的是他每次留言都是一副说教人的样子,自己技术可能是牛逼点吧,也用不着到处说别人吧,反正这个人超级恶心的,头像代表一切~~


引用 65 楼 hudsonhuang 的回复:
Quote: 引用 46 楼 imtns59521 的回复:

Quote: 引用 42 楼 youaway 的回复:

看见SP1234在这里自说自话就烦。
哈哈,顶一个~~~他老是一副说教的样子,很烦


最搞笑经常都没有看清楚人家说什么就开喷啊,明显楼主的意思他都理解错了
而且他自己也经常说错话啊。。。。

+1,我就碰到过。 --------------------编程问答-------------------- 感谢分享!正在学习图像处理的知识。 --------------------编程问答-------------------- 关注一下,CUDA确实是不错,但必须用C去实现,开发效率就低了。 --------------------编程问答-------------------- 标记,受教了,谢谢楼主分享。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 谢过各位大神啦 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 不错  感谢分享!Thanks!   --------------------编程问答-------------------- --------------------编程问答-------------------- 支持一下!!! --------------------编程问答-------------------- --------------------编程问答-------------------- GPU 是硬件吗?嘿嘿! --------------------编程问答-------------------- 挺好的标记下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,