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

时间:2022-06-24 18:36:47
     图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于硬件的性能,现在流行的CPU都是至少2核的,稍微好点的4核,甚至8核,因此,如果能充分利用这些资源,必将能发挥机器的强大优势,为算法的执行效果提升一个档次。

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

     在一般的编程工具中,都有提供线程操作的相关类。比如在VS2010中,提供了诸如System.Threading、System.Threading.Tasks等命名空间,方便了大家对多线程程序的编制。但是直接的使用Threading类还是很不方便,为此,在C#的几个后续版本中,加入了Parallel这样的并行计算类,在实际的编码中,配合Partitioner.Create方法,我们会发现这个类特别适合于图像处理中的并行计算,比如下面这个简单的代码就实现去色算法的并行计算:


private void Desaturate(Bitmap Bmp)
{
    if (Bmp.PixelFormat == PixelFormat.Format24bppRgb)
    {
        BitmapData BmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadOnly, Bmp.PixelFormat);
        Parallel.ForEach(Partitioner.Create(0, BmpData.Height), (H) =>
        {
            int X, Y, Width, Height, Stride;
            byte Red, Green, Blue, Max, Min, Value;
            byte* Scan0, CurP;
            Width = BmpData.Width; Height = BmpData.Height; Stride = BmpData.Stride; Scan0 = (byte*)BmpData.Scan0;
            for (Y = H.Item1; Y < H.Item2; Y++)
            {
                CurP = Scan0 + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    Blue = *CurP; Green = *(CurP + 1); Red = *(CurP + 2);
                    if (Blue > Green)
                    {
                        Max = Blue;
                        Min = Green;
                    }
                    else
                    {
                        Max = Green;
                        Min = Blue;
                    }
                    if (Red > Max)
                        Max = Red;
                    else if (Red < Min)
                        Min = Red;
                    Value = (byte)((Max + Min) >> 1);
                    *CurP = Value; *(CurP + 1) = Value; *(CurP + 2) = Value;
                    CurP += 3;
                }
            }
        });
        Bmp.UnlockBits(BmpData);
    }

  去色的原理就是取彩色图像RGB通道最大值和最小值的平均值作为新的三通道的颜色值。
    做个速度比较:

   图像大小     单线程时间/ms     多线程时间/ms 
   1024*768          5                  2 
   1600*1200         15                 8 
   4000*3000         117                60 
 
   去色是轻量级的数字图像算法,但是再多核CPU上依然能够发挥多线程的速度优势。 

   我们在看看复杂点的算法的例子,这里我们举一个缩放模糊的例子。


public static void ZoomBlur(Bitmap Bmp, int SampleRadius = 100, int Amount = 100, int CenterX = 256, int CenterY = 256)
{
    int Width, Height, Stride;
    BitmapData BmpData = Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    Width = BmpData.Width; Height = BmpData.Height; Stride = BmpData.Stride;

    byte* BitmapClone = (byte*)Marshal.AllocHGlobal(BmpData.Stride * BmpData.Height);
    CopyMemory(BitmapClone, BmpData.Scan0, BmpData.Stride * BmpData.Height);

    Parallel.ForEach(Partitioner.Create(0, Height, Height / Environment.ProcessorCount), (H) =>
    {
        int SumRed, SumGreen, SumBlue,Fx, Fy, Fcx, Fcy;
        int X, Y, I;
        byte* Pointer, PointerC;
        uint* Row, RowP;
        Fcx = CenterX << 16 + 32768;
        Fcy = CenterY << 16 + 32768;

        Row = (uint*)Marshal.AllocHGlobal(SampleRadius * 4);
        for (Y = H.Item1; Y < H.Item2; Y++)
        {
            Pointer = (byte*)BmpData.Scan0 + Stride * Y;
            Fy = (Y << 16) - Fcy;
            RowP = Row;
            for (I = 0; I < SampleRadius; I++)
            {
                Fy -= ((Fy >> 4) * Amount) >> 10;
                *RowP = (uint)(BitmapClone + Stride * ((Fy + Fcy) >> 16));
                RowP++;
            }
            for (X = 0; X < Width; X++)
            {
                Fx = (X << 16) - Fcx;
                SumRed = 0; SumGreen = 0; SumBlue = 0;
                RowP = Row;
                for (I = 0; I < SampleRadius; I++)
                {
                    Fx -= ((Fx >> 4) * Amount) >> 10;
                    PointerC = (byte*)*RowP + ((Fx + Fcx) >> 16) * 3;       // *3不需要优化,编译器会变为lea eax,[eax+eax*2]        
                    SumBlue += *(PointerC);
                    SumGreen += *(PointerC + 1);
                    SumRed += *(PointerC + 2);
                    RowP++;
                }【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。
                *(Pointer) = (byte)(SumBlue / SampleRadius);
                *(Pointer + 1) = (byte)(SumGreen / SampleRadius);
                *(Pointer + 2) = (byte)(SumRed / SampleRadius);
                Pointer += 3;
            }
        }
        Marshal.FreeHGlobal((IntPtr)Row);
    });
    Marshal.FreeHGlobal((IntPtr)BitmapClone);           // 释放掉备份数据
    Bmp.UnlockBits(BmpData);
}

 其中的CopyMemory函数声明如下:

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = true)]
internal static extern void CopyMemory(byte* Dest, byte* src, int Length);
      
我们看看速度提升:

图像大小  单线程时间(ms)  多线程时间(ms)    PS用时(s) 
1024*768      926                556             0.7 
1600*1200     2986              1214             1.5 
4000*3000     21249              6047            7.2 


   从上图中可以看到,图像越大,单线程和多线程之间的时间比例就越大,也越能发挥多线程的优势。

   源码及更多分析详见: http://www.cnblogs.com/Imageshop/p/3344103.html
   

 *********作者: laviewpbt 时间: 2013.9.28  联系QQ:  33184777  转载请保留本行信息*********

 

 

 

104 个解决方案

#1


感谢分享,帮你推荐下。

#2


感谢caozhy,虽然我们之前闹过矛盾。

#3


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


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

#4


该回复于2013-09-28 13:11:22被版主删除

#5


引用 3 楼 sp1234 的回复:
Quote: 引用 楼主 laviewpbt 的回复:

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


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


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

#6


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

其实不是,多线程一样可以带来性能的增益。一个最明显的例子是网络下载。这是一个通过并发(我们往往管CPU的并发叫并行,其实我倒是觉得没有必要严格区分这两个词)实现IO延迟隐藏(网络传输也可以视作是IO延迟)的经典例子。

#7


而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

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

#8


另外,和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

#9


论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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



#10


引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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

呵呵,我也是天天在csdn,都是在讨论技术,有瑕疵人家才会有挑剔,我喜欢

#11


该回复于2013-09-28 13:11:10被版主删除

#12


very good

#13


该回复于2014-10-04 09:45:16被版主删除

#14


收下了!感觉分享!

#15


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

#16


感谢分享!Thanks!

#17


不错  感谢分享!Thanks!

#18


该回复于2013-09-30 22:56:11被版主删除

#19


我要是也会C#就好了

#20


感谢分享,学习了。

#21


该回复于2013-09-28 18:04:34被版主删除

#22


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

#23


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

#24


very very good 

#25


该回复于2013-09-28 22:18:41被版主删除

#26


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

#27


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

#28


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

#29


楼主 我想问你在C#中我想获取系统当前时间的小时和分钟(08:58:00)怎么获取啊?: 【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

#30


该回复于2016-01-31 23:16:40被版主删除

#31


不错  感谢分享!Thanks! 

#32


引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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

#33


引用 1 楼 caozhy 的回复:
感谢分享,帮你推荐下。
支持

#34


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

#35


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

请教下到底什么是并行。

#36


大牛要有大牛的风范,别老摆出一副臭架子的样子比较好。

#37


每天回帖即可获得10分可用分!谢谢楼主的用心分享!!!

#38


受教了,感谢楼主指点~~~~~~~~~~

#39


顶。。。。。。。。。。。。。。。

#40


看看技术部分,其他过滤

#41


LZ使用的并行方法,不是多线程
正如有人所说,并行可以说是GPU的天下,若是想把图像处理效率有数量级的提高,
GPU则是很好的武器
NVIDIA的的CUDA可以看下,
以前做医疗影像的时候,算法部的同事,将灌注的同一算法移植到GPU上,效率提高了5倍,而且还是在没有怎么优化的情况下

#42


看见SP1234在这里自说自话就烦。

#43


【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。现在好多人都在挖掘GPU并行的潜力  效率一般都会增加6倍以上

#44


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

#45


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

#46


引用 42 楼 youaway 的回复:
看见SP1234在这里自说自话就烦。
哈哈,顶一个~~~他老是一副说教的样子,很烦

#47


引用 7 楼 sp1234 的回复:
而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

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

能说点和主题相关的东西不?

#48


GPU的编程方式和CPU好像有很大的差别。国内号称有个全球第一款基于GPU 加速的全功能图片处理软件 Musemage ,处理的速度确实非常不错。

不过有些无法并行的算法还是得靠CPU来实现的。 

#49


虽然看不懂,还是来顶一下

#50


引用 2 楼 laviewpbt 的回复:
感谢caozhy,虽然我们之前闹过矛盾。



呵呵!

#1


感谢分享,帮你推荐下。

#2


感谢caozhy,虽然我们之前闹过矛盾。

#3


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


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

#4


该回复于2013-09-28 13:11:22被版主删除

#5


引用 3 楼 sp1234 的回复:
Quote: 引用 楼主 laviewpbt 的回复:

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


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


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

#6


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

其实不是,多线程一样可以带来性能的增益。一个最明显的例子是网络下载。这是一个通过并发(我们往往管CPU的并发叫并行,其实我倒是觉得没有必要严格区分这两个词)实现IO延迟隐藏(网络传输也可以视作是IO延迟)的经典例子。

#7


而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

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

#8


另外,和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

#9


论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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



#10


引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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

呵呵,我也是天天在csdn,都是在讨论技术,有瑕疵人家才会有挑剔,我喜欢

#11


该回复于2013-09-28 13:11:10被版主删除

#12


very good

#13


该回复于2014-10-04 09:45:16被版主删除

#14


收下了!感觉分享!

#15


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

#16


感谢分享!Thanks!

#17


不错  感谢分享!Thanks!

#18


该回复于2013-09-30 22:56:11被版主删除

#19


我要是也会C#就好了

#20


感谢分享,学习了。

#21


该回复于2013-09-28 18:04:34被版主删除

#22


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

#23


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

#24


very very good 

#25


该回复于2013-09-28 22:18:41被版主删除

#26


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

#27


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

#28


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

#29


楼主 我想问你在C#中我想获取系统当前时间的小时和分钟(08:58:00)怎么获取啊?: 【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。

#30


该回复于2016-01-31 23:16:40被版主删除

#31


不错  感谢分享!Thanks! 

#32


引用 9 楼 laviewpbt 的回复:
论坛里,sp1234以及caozhy 等都是很有能力的,不过说实在的也是很"嚣张的" ,适度保持克制吧,吧内因为两位 而起火的帖子确实不少的,幸好我是天天16个小时在CSDN,知道两位的脾气,才不会上火。  【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。


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

#33


引用 1 楼 caozhy 的回复:
感谢分享,帮你推荐下。
支持

#34


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

#35


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

请教下到底什么是并行。

#36


大牛要有大牛的风范,别老摆出一副臭架子的样子比较好。

#37


每天回帖即可获得10分可用分!谢谢楼主的用心分享!!!

#38


受教了,感谢楼主指点~~~~~~~~~~

#39


顶。。。。。。。。。。。。。。。

#40


看看技术部分,其他过滤

#41


LZ使用的并行方法,不是多线程
正如有人所说,并行可以说是GPU的天下,若是想把图像处理效率有数量级的提高,
GPU则是很好的武器
NVIDIA的的CUDA可以看下,
以前做医疗影像的时候,算法部的同事,将灌注的同一算法移植到GPU上,效率提高了5倍,而且还是在没有怎么优化的情况下

#42


看见SP1234在这里自说自话就烦。

#43


【节前分享】用最简单的方式在C#中使用多线程加速耗时的图像处理算法的执行(多核机器)。现在好多人都在挖掘GPU并行的潜力  效率一般都会增加6倍以上

#44


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

#45


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

#46


引用 42 楼 youaway 的回复:
看见SP1234在这里自说自话就烦。
哈哈,顶一个~~~他老是一副说教的样子,很烦

#47


引用 7 楼 sp1234 的回复:
而且就算考虑到sta线程模式(根本不支持多线程,而是采用消息甭的模式用单个线程队列顺序执行方式来模拟多线程并行程序),那么vb6也根本没有在什么“图像程序”中去纠结sta。vb6的各种底层都是使用vc的。只不过vb6做比较高层的工作,如果需要抛开已经封装好的高层次方法、而必须频繁调用低级的语句,实际上vb6开发人员会直接使用 pinvoke 方式。

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

能说点和主题相关的东西不?

#48


GPU的编程方式和CPU好像有很大的差别。国内号称有个全球第一款基于GPU 加速的全功能图片处理软件 Musemage ,处理的速度确实非常不错。

不过有些无法并行的算法还是得靠CPU来实现的。 

#49


虽然看不懂,还是来顶一下

#50


引用 2 楼 laviewpbt 的回复:
感谢caozhy,虽然我们之前闹过矛盾。



呵呵!