C++ Coder

HCP高性能计算架构,实现,编译器指令优化,算法优化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首页 新随笔 联系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

#

http://blog.csdn.net/bendanban/article/details/7673951

1、Release不能编译成功,提示无法解析的外部变量,或者无法找到**.lib链接库

解决方法是在项目-->属性-->连接器-->常规-->附加库目录,将内容修改为:..\..\..\common\$(PlatformName)\$(ConfigurationName);$(HMPP_PATH)\lib

 

2、大家有没有觉得时间及时不大对呀?

呵呵,这个是真的。在lab中,将

fprintf( stdout, "CPU time             : %.2f ms(best)\n", best_measure/10e3);  

改为

 fprintf( stdout, "CPU time             : %.2f ms(best)\n", best_measure/1e3);

,实际上就是一个数量级的问题。

为了不改变CAPS HMPP labs的原有结构,后面的讲解中将重新搭建项目。希望大家关注奥。。微笑



posted @ 2012-10-21 11:47 jackdong 阅读(260) | 评论 (0)编辑 收藏

CAPS OpenACC网络培训班8月起免费开班,每周四下午3点,可以去看看奥。奋斗

http://www.caps-entreprise.com.cn/many-core/webinar-openacc-1.html

posted @ 2012-10-21 11:45 jackdong 阅读(301) | 评论 (0)编辑 收藏

     摘要: http://blog.csdn.net/bendanban/article/details/7674674一步步做程序优化【1】讲一个用于OpenACC优化的程序 很经典的例子,矩阵的乘法。呵呵。。。 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta*C。它的程序如下: Code highlight...  阅读全文
posted @ 2012-10-21 11:42 jackdong 阅读(1607) | 评论 (0)编辑 收藏

http://blog.csdn.net/bendanban/article/details/7769907

几个很简单的步骤奥:

1)首先你应该下载到软件安装包,http://www.caps-entreprise.com.cn/wp-content/plugins/download-monitor/download.php?id=24  (你要注册才行额)

网站上提供的是最新的64位的Linux版本,

2) 然后是解压,找到那个可执行文件,双击执行下,根据提示一步步安装,成功!


3)执行下$source [HMPP 安装目录]/bin/*.sh

你可以先修改这个sh文件里的第24行为MANPATH=:${HMPP_MAN_PATH}:${HMPP_HOME}/doc/hmpprt-doxygen/cxx/man

这样做是为了兼容Ubuntu

$hmpp --licenses

会出现一些信息,你只要把这些信息发送到apac-support@caps-entreprise.com 就可以了,CAPS会在几个工作日内把License发给你。(这个是人工审核的,如果你幸运的话,只需要几个小时就可以了,相信我没错的!)


4)拿到License后,你把它拷贝到HMPP安装目录下的licenses目录下,然后在执行下$hmpp --licenses

你会看到你可以使用的内容了。


5)随便写个C程序,然后用它编译下,看看效果吧。。

先用这个编译:

$hmpp --codelet-required gcc [any options] [you code .c]

posted @ 2012-10-21 11:32 jackdong 阅读(252) | 评论 (0)编辑 收藏

http://blog.csdn.net/bendanban/article/details/7662583

1、  什么是HMPP

    HMPPHybrid Multicore Parallel Programming的英文缩写。HMPP提供了一些指令,这些指令致力于将可以并行的程序移植到协处理器(协处理器(co-processor)在HMPP中常被称为硬件加速器(Hardware Accelerator HWA))上执行。目前比较熟悉的加速器是GPU以及MIC

    使用HMPP可以有几个好处:

    ① 程序员可以不关心您的程序是在什么类型的硬件加速器上执行,尽管很多情况下大家都知道自己用的是什么加速器。

    ② 如果你的机器没有加速器或者你的加速器不可用,那么你的程序可以继续以原有的方式执行,这样就保证了程序能继续执行。

    ③ 使用HMPP,你只需要几句指令你的程序就可以移植了,再也不用学习什么CUDAOpenCLCg之类的东西了。给大家减轻了负担。

2、  如何获得HMPP

    需要到CAPS的官方网站去登记(http://www.caps-entreprise.com.cn/download/hmpp-openacc-compiler这个网站将主要用于亚洲用户的下载),然后才可以下载HMPP编译器,目前最新的版本是3.1,这个版本只有支持Linux 64位的版本,支持Windows的版本将在晚些时候发布。新的版本加入对OpenACC1.0标准的全部支持。可以同时使用HMPP以及OpenACC的指令,当然我们需要满足一定的规则。这些规则将会在我后续的文章中逐渐讲到。期待大家的关注奥。

3、如何安装HMPP

    在Windows下安装。只需要你双击软件安装包就可以了。然后根据提示安装就可以了。

    在Linux下安装。各位可以参考http://blog.csdn.net/bendanban/article/details/7769907

4、如何使用HMPP

    因为HMPP不会把语言编译的所有活都干完,他需要你有额外的编译器。所以在windows下你最好有Visual Studio,并且推荐VS2008VS9.0)。Fortran语言的话在Windows下推荐使用Intel FORTRAN Compiler

    下面我用VisualStudio2008来配置编译自己的C程序的整个过程。这里假设各位已经安装好了HMPPVisualStudio2008。下面直接配置吧。

          编译环境的配置过程!

       Step1  在你下载的压缩文件中会有类似这样命名的文件:HMPPWorkbench-*.*.*_WindowsTutorial.zip。把他解压,在解压出的文件夹中(labs/common/)找到一个名为HMPP.rules的文件。把这个文件拷贝到[Visual Studio 安装目录]\VC\VCProjectDefaults\目录下。

       Step2 下面使用VS建立自己的工程。打开VS,如图4-1所示建立一个空的工程。

 

 

图4-1

       Step3 在新工程中添加代码文件。你可以拷贝我下面的代码。:-)

 

#include <stdio.h>
int main(int argc, char **argv)
{
    printf(
"Hello HMPP\n");
    getchar();
    
return 0;
}

 

 Step4 添加自定义生成规则搭建所需环境。如图4-2到图4-6所示。

 

 

图4-2

 

 

图4-3

 

 

图4-4

 

 

图4-5

 

 

图4-6

       走到这一步,各位不要着急去编译自己的程序奥。你要确保自己有权利使用HMPP编译器奥。现在唯一的途径就是去CAPS的官方网站去登记,然后获得试用版的license才行奥。下面假设你已经获得了License文件。讲述如何成功编译第一个Hello HMPP程序。

       编译权限的配置过程! 

Step1 首先将你获得的.lic拷贝到HMPP安装目录下的licensens文件夹下。 

Step2 按照图4-7打开控制台,按照图4-8所示执行命令。千万注意,一定不要在需要使用HMPP编译时关闭你刚刚打开的控制台。 

完成上面这两大部分之后,就可以编译执行第一个HMPP编译出的程序了!!图4-9展示了执行结果。

 

 

 

图4-7

 

 

图4-8

 

 

图4-9

      

参考文献:

[1] HMPPWorkbench-2.5_HMPP_Directives_ReferenceManual[M/OL].


posted @ 2012-10-21 11:31 jackdong 阅读(308) | 评论 (0)编辑 收藏

http://blog.csdn.net/bendanban/article/details/6435314

VisualStudio2010据说完美支持CUDA4.0,我研究了一下,下面将我的配置过程呈献给大家,希望对大家有所帮助。

第一步:下载CUDA4.0 Driver,toolkit,SDK,这些不在提了,只要各位去Nvidia的官网下载并且一次安装就是了,不过各位在安装前必须将以前的版本卸载掉。当然VisualStudio2010是必须的,各位必须要安装它,要不我的文章题目就没意义了。一切安装就绪后,下面开始配置。

第二步:打开VS2010,新建一个Win32控制台应用程序(英文是Win32ConsoleApplication)。

clip_image002

图1 新建Win32控制台程序

确定后,在向导中选择空项目:

clip_image004

图2 空项目

第三步:添加CU文件,右击项目-》“添加”-》“新建项”

clip_image006

图3 添加CU文件

第四步:为“test.cu”添加生成规则

右击项目,选择“自定义生成”,会跳出图4框,如图所示操作。

clip_image008

图4选择自定义生成规则

右击你添加的CU文件,选择属性,然后按图示操作。

clip_image010

图5 修改CU文件的生成规则为CUDA C/C++

clip_image012

图6 应用后的结果

第五步:添加附加依赖项cuda.lib;cudart.lib。右击项目,选择属性,然后按图示操作。

clip_image014

图7 添加附加依赖项

第六步:测试。在CU问价中添加如下代码:(很假单的代码,呵呵)

#include <cuda.h>

#include <cuda_runtime_api.h>

int main(int argc, char *argv[])

{

float *device_f = NULL;

cudaMalloc((void**)&device_f, 10*sizeof(float));

//

cudaFree(device_f);

return 0;

}

生成:

clip_image016

图8生成结果

重要提醒:程序最好不要放在含有汉字的目录下,如果提示有规则错误,先关闭VS,然后把解决方案目录下的那个数据库,Debug文件夹删除。项目目录下的Debug也删除。这主要是由于两家公司(Nvidia、Microsoft)的问题。

为了让你相信我的配置是成功的,我把我的一个图像处理结果贴出来。

clip_image018

Lenna原图

clip_image020

Lenna锐化结果

 

很需要的额外的两步:

一、将SDK目录下:…/NVIDIA GPU Computing SDK 4.0/C/doc/syntax_highlighting/visual_studio_8 。将此目录下的usertype.dat拷贝到…/Microsoft Visual Studio 10.0/Common7/IDE目录下。

二、在菜单栏中选择“工具”->“选项”。然后按照图示操作就行了。操作完后,记得重启VS2010。

clip_image022

posted @ 2012-10-21 11:28 jackdong 阅读(483) | 评论 (0)编辑 收藏

http://blog.csdn.net/bendanban/article/details/7928744
引言:

    什么是基于指令的移植方式呢?首先我这里说的移植可以理解为把原先在CPU上跑的程序放到像GPU一样的协处理器上跑的这个过程。在英文里可以叫Porting。移植有两种方式:一种是使用CUDA或者OpenCL来重新设计代码,然后使用硬件厂商提供的编译器来编译;一种是使用OpenACC或者OpenHMPP提供的指令集添加到你想使用GPU计算的源代码中的某个位置,让编译器来编译出GPU上执行的代码。后一种方式就是基于指令的移植方式。   

     例如,下面一个简单的循环:

for (i=0; i<n;i++)
{
    dosomething(i);
}

 

如果你想把这个循环放到GPU上,让每个线程计算一次i的话,可以这样做:

#pragma acc kernels

 

for (i=0; i<n;i++)
{
    dosomething(i);
}

网格化(gridification):
    这样,编译器拿到加了OpenACC指令的那段代码后,就会把你的循环放到GPU或者其他硬件加速器(例如MIC)上。编译器分析了#pragma acc kernels下面的那个循环,就会根据循环的次数来分配线程数量,这个过程就叫网格化。为什么说是网格化呢?可以这样理解,因为GPU可以启动很多线程,这些线程就像一张渔网一样,可以认为一个网格代表一个线程,所以我就干脆叫这个过程为“网格化”了。

 内核(kernel)

    在OpenACC里可以这样理解内核:内核就是在协处理器(例如GPU)上被多个线程同时执行的一段代码。如果每个线程都做一个活,岂不是没意思了么?当然不是这样的,他们执行的代码是一样的,但是每个线程可以根据自己的ID号来针对不同的数据做同样的工作,这也就是数据并行的含义。

 

codelet

    使用CAPS的HMPP Workbench编译加了OpenACC指导语句的源代码时,编译器会告诉你codelet产生了。实际上产生了一个CUDA或者OpenCL的源文件,这个源文件中包含了根据你的指导语句生成的CUDA或者OpenCL的源代码。那什么是codelet呢?可以认为codelet就是数据管理+内核。一个codelet要干的事情包括两部分:申请和管理CPU和协处理器之间的存储,还有就是启动在协处理上执行的代码。

 

work-sharing

    这个词可以理解为名词“共享工作”。如果在协处理器上的线程们执行的工作时work-sharing的,那么每个线程可以根据自己的ID在不同的数据上干了相似的工作。这个词是在使用OpenACC或者OpenHMPP移植代码的时候遇到的,它描述的是CPU的串行代码中的状态,例如:

 

for (i=0; i<n; i++)
{
    a[i] 
= i;
}

在这段代码中,a[i]的计算与a[i]之外的a的元素没有依赖性,所以,每次循环的i可以使独立的完成的,像这样的状态就是work-sharing的。还有例如规约,

= 0;
for (i=0; i<n; i++)
{
   s
+=a[i];
}

虽然s的计算与i相关,但是细想一下,加法在数学上市满足交换律的,s的每次加a[i]实际上不相关的,你不管以什么顺序加和a[i]到s,解结果总是一样的。所以规约也可以理解为是worksharing 的。就说这么多吧。如果大家有什么问题,欢迎给我留言奥。

posted @ 2012-10-21 11:23 jackdong 阅读(501) | 评论 (0)编辑 收藏

CAPS发布了自己的HMPP编译器3.1版本,全部支持OpenACC特性。大家来围观把。。

下面是官方的中文网站。

http://www.caps-entreprise.com.cn/many-core/product-hmpp-v3-1.html
posted @ 2012-10-21 11:21 jackdong 阅读(235) | 评论 (0)编辑 收藏


在西雅图超级计算大会(SC11)上发布了新的基于指令的加速器并行编程标准,既OpenACC这个开发标准的目的是让更多的编程人员可以用到GPU计算,同时计算结果可以跨加速器使用,甚至能用在多核CPU上
出于显而易见的原因,NVIDIA在大力推广和支持OpenACC。但事实上PGI和Cray才是最早推动这项技术商业化的公司。PGI已经推出了一组非常类似的加速器指令,目前也成为了OpenACC标准的基础部分之一。Cray公司正在开发自己的OpenACC编译器,并且他的XK6客户如橡树岭国家实验室和瑞士国家超级计算机中心,预计将成为该技术的第一批超级计算机用户。
简而言之,OpenACC指令与OpenMP指令工作方式很类似,但前者特别适用于高度数据并行代码。它们可插入标准的C,C + +和Fortran程序直接指导编译器进行某些代码段的并行。编译器会特别注意数据在CPU和GPU(或其他)之间来回转移的逻辑关系,并将计算映射到适当的处理器上。
这样,开发人员就可以在现存的或者新的代码上做相对小的改动以标示出加速并行区域。由于指令设计适用于一个通用并行处理器,这样相同的代码可以运行在多核CPU、GPU或任何编译器支持的其他类型的并行硬件上。这种硬件的独立性对于HPC的用户来说特别重要,因为他们不愿意接受那种受供应商限制的,非便携式编程环境。
站在NVIDIA的角度,目标就是将GPU计算带入后CUDA时代。今天,CUDA C和CUDA Fortran广泛用于GPU编程。但是这个底层技术属于NVIDIA,对于GPU计算提供了一个相对低阶的软件模型,因此想较于对一般编程人员或者研究人员,CUDA的使用对于计算科学类型而言受限制程度越来越明显
受NVIDIA、AMD等支持的OpenCL同样也提供了GPU和其他加速器的并行编程框架。与CUDA不一样的是,OpenCL是个真正开放的标准。 但与CUDA相似的是,OpenCL相对底层,需要对目标处理器的内部结构有一定了解。因此与CUDA一样,使用OpenCL对于计算机科学家来说有很大的局限性。  
NVIDIA公司估计这个星球上有超过10万的CUDA程序员和比较多的的OpenCL开发人员,但他们也意识到如果能够使GPU编程更加开放且开发界面更加友好,就会有一个更大的潜在观众。从本质上讲,他们认为OpenACC将能够被数以百万计的科学家和研究人员使用,这些人不需要关心和涉足处理器架构,也不需要关心芯片与芯片之间通信
NVIDIA的Tesla业务部门的首席技术官Steve Scott总结了OpenACC目标:“我们确实想在这一点上做到大幅提高适用性和人们利用GPU的广度和深度。”
Scott表示作为高层OpenACC不会影响执行性能。这来自于他以前在Cray公司做首席技术官的经验,他遇到了基于加速器的指令代码只比手工CUDA编码的性能低5%到10%而已。据他介绍,这是相当典型的。Scott说,有些应用程序甚至做的比他们用CUDA编程要好,这受益于编译器在对某些代码进行优化的能力超越了凡人。在任何情况下,OpenACC的目的是要利用CUDA进行互操作,因此如果需要的话,可以手工调整内核,并与指令代码做无缝连接。
除了PGI和Cray公司,法国的多核软件工具的开发者CAPS公司,也签署了协议支持新的指令。这三家厂商预计在2012年上半年推出支持OpenACC的编译器。值得注意的是OpenACC支持者列表中缺少了英特尔和AMD,不过这也不会阻止PGI、CAPS或者Cray建立支持英特尔和AMD硬件的OpenACC编译器。
PGI和NVIDIA目前向开发人员推出了30天免费试用PGI的加速指令编译器。活动宣传说可以在四周之内将应用性能翻倍。上百位研究人员已经注册了申请试用,
不过对于OpenACC的支持者来说真正终结这场游戏的是将指令纳入到OpenMP标准。因为OpenACC的一部分工作来源于OpenMP,所以就意味着这件事情发生的可能性很高,不过目前没有时间表,但最有可能结合的时间是在2012年某时OpenMP 4.0发布的时候。
posted @ 2012-10-21 11:11 jackdong 阅读(1557) | 评论 (0)编辑 收藏

WIN8  注册 卸载dll
报错:

模块"xxxx.dll"已加载,但对DllRegisterServer的调用失败,错误代码为 XXXXXXXXX

解决方法:

若为安装,首先要保证XXX.dll在system32中,或者给出DLL的完整路径。

运行  输入 cmd  会显示cmd.exe 右键  “以管理员身份运行” 注册dll

 

在cmd界面:

输入  regsvr32  %systemroot%/system32/XXX.ocx (XXX.dll) 回车

 

卸载控件:
 
在cmd界面:
输入 regsvr32 /u  ****.dll   回车
输入 regsvr32 /u  ****.ocx  回车
posted @ 2012-10-20 16:39 jackdong 阅读(3472) | 评论 (0)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10