共 1,395 篇文章
共 6,621 篇文章及评论
- Association for Computing Machinery TechNews (ACM)
- Go Parallel! (Dr. Dobbs)
- HPCwire (Tabor Communications, Inc.)
- insideHPC (John West)
- Joe Duffy's Weblog (Microsoft)
- Microsoft Parallel Programming Development Center (Microsoft Germany)
- MultiCoreInfo.com
- scalability.org (Scalable Informatics)
- Software Dev Blog (Intel Germany)
- Soft Talk Blog (Intel United Kingdom)
- The Moth (Microsoft)
帖子位于 "软件开发工具" 分类 
Intel MKL函数,如何得到相同的计算结果?
作者: Chao Y (Intel) (4 篇文章) 日期: 五月 22, 2012 在 3:20 下午
评论 (0)
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同。 事实上,程序往往很难保证做到这一点。 为什么呢? 我们先看一个简单的例子: 当程序使用单精度或者双精度的浮点数时, 浮点数有一定的精度的限制。 单精度的浮点数,使用23位二进制表示的尾数。 双精度浮点数,使用52位的二进制(http://en.wikipedia.org/wiki/IEEE_754-1985)。 如果,程序中计算下面的表达式: double d1,d2,d3,d4,d5; ...
分类: 并行计算, 软件开发工具
标签:MKL, MKL 函数, 结果不同
OpenMP 概述
作者: xwebsite (2 篇文章) 日期: 五月 7, 2012 在 6:19 下午
评论 (0)
根据计算平台和规模的不同,并行计算可以分为两种:第一种是基于单一计算机系统的多核处理器或多处理器进行多线程并行计算,采用共享存储的方式,主要的标准有OpenMP,如下左图所示;第二种就是基于多台计算机组件的集群(Cluster)计算系统进行并行计算,采用消息传递方式,主要的标准有MPI,如下右图所示。本文将主要介绍多线程方式的并行计算。 首先来了解一下单核处理器上程序运行方式,系统中包括操作系统和应用程序等都以进程(Process)形式存在,当程序结束时这个进程也就跟着消亡。每个进程中至少包含一个线程(Thread),一个线程用于完成程序的某个功能,一个程序中一般都包含多个线程,所有的这些线程在系统中都成队列形式。对于一个核心的处理器来说,某一时刻,它只能处理一个线程。这个线程处理之后就处理下一个线程,依次循环处理。由于CPU的主频都非常高,如Intel的奔四可到3GHz,所以每个线程处理的时间都非常短,以致我们并不会察觉。但是它们实际上是以串行的形式在CPU上运行。所以在物理上,对于单核处理器来说,是无法实现物理上的并行。在单核处理器上,即使使用多线程来分发程序,但实际上还是以单线程的形式在运行。 如果将执行核增加一个,那么在同一时刻,将会有两个线程在运行,这样将会在一定程度上提供计算机的运行速度,但对于某些单线程的程序过程来说,实际情况并没用得到改善。至于系统中的线程怎么分发到两个核上,这就是操作系统的任务了。很多应用程序都不止包含一个线程,一般都包含有多个线程,如用Spy++工具查看系统所有的线程,如下图所示: 这多个线程如果在一个执行核上运行,它们呈一个队列来执行。如果在两个执行核上运行的话,它们将呈两队来执行。如果某个程序中包括有四个线程,而这四个线程又分别在两个核上执行,那么执行该程序将节约一半的时间。但如果该程序是单线程,无论是单核还是多核,运行该程序所需的时间都将是一样的。所以,以前有人在某单线程程序中将一些程序分开放在两个线程中分别执行,效率得到了提高,节约将近一倍的时间,其原因就在此。 OpenMP提供的就是一个多线程编程标准,现在.Net平台也提供了并行编程的System.Threading.Tasks.Parallel类,可以使多个线程能够同时执行。如果直接采用多个线程去实现并行,需要经常处理线程或线程池,采用这些多线程编程标准可以简化并行开发,也不必直接处理线程或线程池。 在C/C++中采用OpenMP指令的格式如下: #pragma omp … 关键字omp表示这个指令是OpenMP指令,所以它会被OpenMP编译器处理,其他非OpenMP编译器将不会理会。由于OpenMP指令都预先定义了,所以很容易被识别出来。这样程序员编写的并行代码就可以在不同的平台上运行。如果平台不支持并行,也会直接跳过并行指令把程序当作串行程序来运行。 OpenMP提供了两种控制并行的结构:第一种就是提供了一个用于创建多线程程序的指令,这些线程相互之间是并行的,这个指令实际上就是创建了一些线程去执行并形体中的程序;第二种就是对已存在的并行结构进行分工的指令,像循环中的do指令(Fortran)或for(C/C ++)。 一个OpenMp程序通常都是从一个单线程程序开始,我们通常把这个单线程程序叫做主线程(Master Thread),在主线程的程序中应该要包含整个程序中需要使用的数据变量,包括全局变量。当主线程遇到并行结构时,将会创建新的线程来执行并形体中的程序。每个线程都会独立的执行并形体中的程序,相互之间不会影响,但是它们之间可以共用主线程里面定义的全局变量。在并行过程中具体哪些变量是共享的、哪些变量是线程私有的,可以通过条件clauses(…)对每个变量进行指定,这些条件用于并行线程中决定哪些可用。一个变量可以有三种类型,即shared、private和reduction。其中shared表示在并行结构中将有一个单独的内存位置来存放这个变量,所有的并行线程都可以使用这个变量,所有的并行线程将共享这块内存地址,因此,线程间的通信通过普通的读写操作方式就可以实现,当然,这个变量也可以随意被任何一个线程修改。相反,private变量将会有多个内存地址,每个线程里面一个。这个变量的所有读写操作都只限于本线程,其他线程是无法访问本线程中该变量的内存地址的。所以,一般都用于定义临时变量。reduction就有点难理解了,它具有shared和private的特征,就像它的字面意思一样,reduction属性用于需要下降的变量(指值的减少)。Reduction操作在很多程序中都非常重要,最常见的例子就是计算并行结构中最后的临时局部变量的总和。除了这三种之外,OpenMP还提供了许多其他数据属性参数。 多个OpenMP线程之间可以采用共享变量(shared)通过简单的读写操作来进行通信,但是这需要在多个线程中协调一致。如果协调不一致,可能会出现多个线程同时修改这个变量,或者这个线程正在读而那个线程又正在写,这些潜在的冲突都将导致数据的错误,因此,在多线程中必须避免这种情况,必须明确地协调好。在并行程序中设置同步(synchronization)就可以协调这些执行的多线程。最常见的两种情况就是相互排斥和事件同步,互斥就是在这段代码中通过一个线程不让其他线程读取这个共享变量。当很多线程正在修改同一个变量时,为了确保这个变量值是对的,在修改之前就需要进行互斥存取。OpenMP中提供了一个critical指标来表示互斥。事件同步常用于表示多线程间的事件,最简单的形式就是barrier阻塞。在并行程序中barrier指标表示在某点处每个线程都在这等待其他的线程也运行到这里,一旦所有的线程都达到这个点后,它们又继续执行。就像跑步的时候,有的人跑得快,有的人跑得慢,在跑了两圈的时候,所有人都在这里等待最后一个人,当最后一个人也跑到两圈的时候,然后大家又接着继续跑,这个过程就称为barrier阻塞。barrier指令能保证所有线程都执行了在barrier之前的代码。 一个典型的并行程序结构如下图所示: OpenMP API是一套非常简便的共享存储并行计算应用程序接口,它是一个多线程、共享存储的模型。线程间通过共享的变量进行交换,并可以通过线程同步来防止数据冲突,当然,同步是需要耗费很多的资源的,所以尽量减少同步的需要。
分类: 博客征文专栏, 并行计算, 软件开发工具
C++编译器到底能帮我们把代码优化到什么程度?
作者: hengyunabc123 (1 篇文章) 日期: 三月 22, 2012 在 12:28 下午
评论 (1)
一个简单的累加求和程序: 01.TYPE S=0; 02.for(int i = 0;i < SIZE; i++) { 03. S ...
分类: 博客征文专栏, 开放源代码, 软件开发工具
Intel MKL 多线程设置
作者: Chao Y (Intel) (4 篇文章) 日期: 三月 20, 2012 在 2:58 下午
评论 (1)
对于多核程序,多线程对于程序的性能至关重要。 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念: 1>MKL 是线程安全的: MKL在设计时,就保证它是一个线程安全的库函数。 也就是说,无论是在单个线程中调用MKL函数,还是在多个线程中同时使用Intel MKL 函数,都能够确保函数有正确的计算结果。 2>MKL函数内部实现了多线程优化。许多MKL的函数,已经包括内部多线程的实现。用户调这些函数时,只需设置多线程的数目,MKL ...
分类: 并行计算, 软件开发工具
一个游戏程序员的学习资料
作者: weiqubo (3 篇文章) 日期: 三月 20, 2012 在 1:29 下午
评论 (28)
想起写这篇文章是在看侯杰先生的《深入浅出MFC》时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考。一则是作为自己今后两年学习目标的备忘录,二来没准对别人也有点参考价值。我的原则是只写自己研究过或准备研究的资料,所以内容无 疑会带上强烈的个人喜好色彩, 比如对网络,数据库等重要方面完全没有涉及。因为自己主要对三维图形引擎, 人工智能算法, 脚本系统, 反外挂 (反反外挂? ^-^)等方面感兴趣。这学期电脑都没联网了,在岳麓山闭关修炼中(^-^),连这篇文章都得在学校图书馆电子阅览室(电影放映室?)上传,内容很多凭记忆写出, ...
分类: 其他, 博客征文专栏, 游戏, 软件开发工具
Intel(R) Optimized LINPACK Benchmark 性能测试
作者: Chao Y (Intel) (4 篇文章) 日期: 二月 23, 2012 在 10:50 上午
评论 (0)
Linpack是我们常用的CPU性能测试程序。它通过计算双精度线性方程组的求解来测试CPU的运算能力。Intel MKL提供一个优化版本的Intel(R) Optimized LINPACK Benchmark,通过运行这个程序,我们可以方便进行CPU的基准性能测试。 Intel(R) Optimized LINPACK Benchmark是根据LINPACK 1000 benchmark优化后的程序。程序根据用户指定的参数生成一个线性的方程组,通过方程的求解时间与计算量,来计算CPU的浮点性能。 运行这个程序基本步骤为: 1>Intel(R) ...
分类: 其他, 并行计算, 软件开发工具
标签:Intel MKL, LINPACK, LINPACK Benchmark
移动Web应用程序开发HTML5篇 (三) Canvas API
作者: Dawei Cheng 程大伟 (Intel) (43 篇文章) 日期: 二月 22, 2012 在 1:52 下午
评论 (0)
介绍 本系列博客将主要介绍如今大红大紫的移动Web应用程序开发最重要的三个工具:HTML5,JavaScript, CSS3。 本篇是HTML5介绍的第三篇,主要介绍HTML5的Canvas API。 相关文章: 移动Web应用程序开发 HTML5篇 (一) HTML5简介 移动Web应用程序开发 HTML5篇 (二) ...
分类: 全国大学生软件创新大赛专栏, 博客征文专栏, 移动技术, 英特尔® 软件网络 2.0, 软件开发工具, 软件技术学习及认证
标签:Canvas, HTML5, Web应用开发, 移动开发
Tizen SDK Intro (2) – 安装
作者: Li Zhang (Intel) (3 篇文章) 日期: 二月 21, 2012 在 9:17 下午
评论 (2)
本文将介绍下Tizen SDK的安装。 1. 软硬件要求 32位Ubuntu10.04/10.10/11.04,目前暂不支持Windows, Mac等系统,未来将会推出(由于Tizen SDK工具链里面需要用到deb相关的,所以Ubuntu是最方便的操作系统,笔者使用的测试环境为Ubuntu 11.10) 至少双核2G的CPU(建议使用有VT支持的CPU) 至少2G内存 至少3G以上剩余硬盘空间(SDK安装后约3.1G,所以少于3G是不行的) ...
分类: 移动技术, 软件开发工具
标签:SDK, Tizen, 泰泽
如何用 VC++ 编写 MIDI 文件播放程序
作者: playboy1 (1 篇文章) 日期: 二月 14, 2012 在 5:35 下午
评论 (2)
MIDI的意思是乐器数字接口:(Musical Instrument Digital Interface)它是早在微软开发Windows以前就有的一个用于电子键盘的标准。MIDI定义了一个传输和存储音乐信息的协议。 Win32 API 提供了几种处理MIDI数据的方法。在Windows中有很多方法播放MIDI文件。这里我们讨论一种最简单的方法。 01.ShellExecute (hWnd, "open", "c:\\windows\\media\\Canyon.mid", NULL, ...
分类: 博客征文专栏, 图形和视觉计算, 软件开发工具
在 Win32 下用 C++ 实现多线程读写锁
作者: chexlong (1 篇文章) 日期: 二月 14, 2012 在 5:34 下午
评论 (2)
读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。 现在Win32的API,用C++实现自己的读写锁。这组API包括:CreateMutex,CreateEvent,WaitForSingleObject,WaitForMultipleObjects,ResetEvent,ReleaseMutex,SetEvent,CloseHandle。以下代码在VS2005下,已经编译通过。 RWLockImpl.h 01.#ifndef _RWLockImpl_Header 02.#define _RWLockImpl_Header 03. 04.#include 05.#include 06.#include 07.#include 08. 09.using namespace std; 10. 11./* 12. 读写锁允许当前的多个读用户访问保护资源,但只允许一个写读者访问保护资源 13.*/ 14. 15.//----------------------------------------------------------------- 16.class CRWLockImpl 17.{ 18.protected: 19. CRWLockImpl(); 20. ~CRWLockImpl(); 21. void ...
