越来越快的循环

简介:

随着多核计算机变得越来越普遍,令人烦恼的是循环不能利用这些多余的内核资源。不过幸运的是微软的帅哥靓女为我们解决了这种困惑,他们已采取措施使我们循环可以利用这些额外的内核资源。我将展示一个代码示例,演示.NET 4.0中的一个新的功能叫做Task Parallel Library。有了这个库,可以非常容易编写托管语言来使用多内核。这样我们就可以编写并行任务的代码,它可以同时运行在可用的处理器上。一般来说,这样可以显着地加快了代码运行的速度。

这里有一个并行示例的代码:

using System;
namespace ParallelForSample
{
  public class SingleCore
  {
    public static void Calculate(int calcVal)
    {
      Utility util = new Utility();
      util.Start();

      int[,] G = new int[calcVal, calcVal];
      for (int k = 0; k < calcVal; k++)
        for (int i = 0; i < calcVal; i++)
          for (int j = 0; j < calcVal; j++)
            G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
      util.Stop();

    }
  }
}

正如你可以看到,这是一个相当简单的类 - 它用了三个循环填充数组。现在,使用TPL(Task Parallel Library)重写这段代码:

using System;
using System.Threading.Tasks;

namespace ParallelForSample
{
  public class MultiCore
  {
    public static void Calculate(int calcVal)
    {
      Utility util = new Utility();
      util.Start();

      int[,] G = new int[calcVal, calcVal];

      Parallel.For(0, calcVal,
        delegate(int k)
        {
          Parallel.For(0, calcVal, delegate(int i)
          {
            for (int j = 0; j < calcVal; j++)
              G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
          });
        }
      );

      util.Stop();
    }
  }
}
正如你可以看到,这是语法是稍有不同。 for循环分解成Parallel.For。这需要一个委托,实际上执行循环的行为的是这个委托。如果你下载并运行该示例,您可以观察到不同的行为和不同的循环计时。
不过需要有一个多核的机器,才可以看到这种差距,如果是一台单核的机器,你是观察不到的。
以下是译者加:
我的电脑配置如下图:
peizhi 
运行结果:
fortest 

我们可以看到差距接近10秒之多。






本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/05/04/faster-faster-loops.html,如需转载请自行联系原作者

相关文章
|
9月前
|
人工智能 自然语言处理 算法
谷歌DeepMind研究再登Nature封面,隐形水印让AI无所遁形
近日,谷歌DeepMind团队在《自然》期刊上发表了一项名为SynthID-Text的研究成果。该方法通过引入隐形水印,为大型语言模型(LLM)生成的文本添加统计签名,从而实现AI生成文本的准确识别和追踪。SynthID-Text采用独特的Tournament采样算法,在保持文本质量的同时嵌入水印,显著提高了水印检测率。实验结果显示,该方法在多个LLM中表现出色,具有广泛的应用潜力。论文地址:https://www.nature.com/articles/s41586-024-08025-4。
303 26
|
8月前
|
SQL 分布式计算 数据挖掘
阿里云 MaxCompute MaxQA 开启公测,公测可申请 100CU 计算资源解锁近实时高效查询体验
阿里云云原生大数据计算服务 MaxCompute 推出 MaxQA(原 MCQA2.0)查询加速功能,在独享的查询加速资源池的基础上,对管控链路、查询优化器、执行引擎、存储引擎以及缓存机制等多个环节进行全面优化,显著减少了查询响应时间,适用于 BI 场景、交互式分析以及近实时数仓等对延迟要求高且稳定的场景。现正式开启公测,公测期间可申请100CU(价值15000元)计算资源用于测试,欢迎广大开发者及企业用户参与,解锁高效查询体验!
阿里云 MaxCompute MaxQA 开启公测,公测可申请 100CU 计算资源解锁近实时高效查询体验
|
Windows
Multisim 14 常见电子仪器的使用和Multisim的使用
Multisim 14 常见电子仪器的使用和Multisim的使用
382 1
|
10月前
|
存储 缓存 网络协议
阿里云服务器实例选择:c7/g7/r7和c8i/g8i/r8i及c8y/g8y/r8y实例对比与选择参考
本文将重点介绍阿里云服务器七代云服务器实例(计算型c7、通用型g7、内存型r7)、八代云服务器实例(计算型c8i、通用型g8i、内存型r8i)以及倚天云服务器实例(计算型c8y、通用型g8y、内存型r8y)的主要性能、适用场景及选择参考,帮助用户根据自己的需求选择合适的云服务器实例。
409 10
|
传感器 物联网 Linux
物联网设备的操作系统之争:Linux vs RTOS
【6月更文挑战第4天】在遥远的数码星球,物联网城中的Linux先生与RTOS小姐展开激烈角逐,分别在操作系统领域各显神通。Linux先生以其开源、兼容性强、功能丰富占据服务器、桌面及嵌入式设备市场,适合处理复杂任务和需要强大计算能力的设备。而RTOS小姐以实时性、高效响应和低资源占用见长,适用于资源有限、强调实时性的物联网设备。设备制造商在两者间抉择,引发物联网设备操作系统的选择大战。通过Python与FreeRTOS示例,展现了两者在智能家居和生产线控制等场景的应用。在物联网世界,Linux与RTOS共同推动设备智能化,为生活带来更多便捷。
693 3
|
网络安全 数据安全/隐私保护 C++
VS Code 的SSH连接不成功问题分析与解决
VS Code 的SSH连接不成功问题分析与解决
|
数据库 Python
django中的models.ManyToManyField 字段如何新增,通过Category,如何反向查询Product
django中的models.ManyToManyField 字段如何新增,通过Category,如何反向查询Product
217 10
|
11月前
|
Kubernetes Linux 调度
【赵渝强老师】K8s的周期性任务控制器CronJob
本文介绍了K8s中的CronJob控制器,它类似于Linux的crontab命令,用于管理和调度定时作业。CronJob可以设置在未来某一时间运行作业一次或在指定时间点重复运行作业。文章通过一个示例展示了如何创建和使用CronJob控制器,包括创建配置文件、应用配置、查看Pod信息和日志等步骤。同时,还解释了CronJob的时间表示方式及其限制。
208 0
|
Docker 容器
14 response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file speci
14 response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file speci
313 1
|
Kubernetes 安全 测试技术
多环境镜像晋级/复用最佳实践
本文介绍了在应用研发场景中,如何通过阿里云服务实现镜像构建部署的高效和安全。主要关注两个实践方法来确保“所发即所测”。
46277 9