﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Coder-随笔分类-OpenACC</title><link>http://www.cppblog.com/jackdongy/category/20101.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 21 Oct 2012 04:14:18 GMT</lastBuildDate><pubDate>Sun, 21 Oct 2012 04:14:18 GMT</pubDate><ttl>60</ttl><item><title>OpenACC的免费课程！ </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193592.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 03:45:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193592.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193592.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193592.html</trackback:ping><description><![CDATA[<h1 class="category-title"><span style="font-size: 18px">CAPS OpenACC网络培训班8月起免费开班，每周四下午3点，可以去看看奥。<img alt="奋斗" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif" /></span></h1>
<p><a href="http://www.caps-entreprise.com.cn/many-core/webinar-openacc-1.html" target="_blank">http://www.caps-entreprise.com.cn/many-core/webinar-openacc-1.html</a></p><img src ="http://www.cppblog.com/jackdongy/aggbug/193592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 11:45 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一步步做程序优化_讲一个用于OpenACC优化的程序</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193591.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193591.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193591.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193591.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 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...&nbsp;&nbsp;<a href='http://www.cppblog.com/jackdongy/archive/2012/10/21/193591.html'>阅读全文</a><img src ="http://www.cppblog.com/jackdongy/aggbug/193591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 11:42 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于指令的移植方式的几个重要概念的理解（OpenHMPP, OpenACC） </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193587.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193587.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193587.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193587.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193587.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/bendanban/article/details/7928744">http://blog.csdn.net/bendanban/article/details/7928744</a><br />引言：</p>
<p>&nbsp;&nbsp;&nbsp; 什么是基于指令的移植方式呢？首先我这里说的移植可以理解为把原先在CPU上跑的程序放到像GPU一样的协处理器上跑的这个过程。在英文里可以叫Porting。移植有两种方式：一种是使用CUDA或者OpenCL来重新设计代码，然后使用硬件厂商提供的编译器来编译；一种是使用OpenACC或者OpenHMPP提供的指令集添加到你想使用GPU计算的源代码中的某个位置，让编译器来编译出GPU上执行的代码。后一种方式就是基于指令的移植方式。&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;例如，下面一个简单的循环：</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img onclick="this.style.display='none'; Codehighlighter1_19_41_Open_Text.style.display='none'; Codehighlighter1_19_41_Closed_Image.style.display='inline'; Codehighlighter1_19_41_Closed_Text.style.display='inline';" id="Codehighlighter1_19_41_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_19_41_Closed_Text.style.display='none'; Codehighlighter1_19_41_Open_Image.style.display='inline'; Codehighlighter1_19_41_Open_Text.style.display='inline';" id="Codehighlighter1_19_41_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_19_41_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_19_41_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dosomething(i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p>如果你想把这个循环放到GPU上，让每个线程计算一次i的话，可以这样做：</p>
<p><span style="color: red"><strong>#pragma acc kernels</strong></span></p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img onclick="this.style.display='none'; Codehighlighter1_19_41_Open_Text.style.display='none'; Codehighlighter1_19_41_Closed_Image.style.display='inline'; Codehighlighter1_19_41_Closed_Text.style.display='inline';" id="Codehighlighter1_19_41_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_19_41_Closed_Text.style.display='none'; Codehighlighter1_19_41_Open_Image.style.display='inline'; Codehighlighter1_19_41_Open_Text.style.display='inline';" id="Codehighlighter1_19_41_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_19_41_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_19_41_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;dosomething(i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>网格化（gridification）：<br />&nbsp;&nbsp;&nbsp; 这样，编译器拿到加了OpenACC指令的那段代码后，就会把你的循环放到GPU或者其他硬件加速器（例如MIC）上。编译器分析了#pragma acc kernels下面的那个循环，就会根据循环的次数来分配线程数量，这个过程就叫网格化。为什么说是网格化呢？可以这样理解，因为GPU可以启动很多线程，这些线程就像一张渔网一样，可以认为一个网格代表一个线程，所以我就干脆叫这个过程为&#8220;网格化&#8221;了。 </p>
<p>&nbsp;内核（kernel）</p>
<p>&nbsp;&nbsp;&nbsp; 在OpenACC里可以这样理解内核：内核就是在协处理器（例如GPU）上被多个线程同时执行的一段代码。如果每个线程都做一个活，岂不是没意思了么？当然不是这样的，他们执行的代码是一样的，但是每个线程可以根据自己的ID号来针对不同的数据做同样的工作，这也就是数据并行的含义。</p>
<p>&nbsp;</p>
<p>codelet</p>
<p>&nbsp;&nbsp;&nbsp; 使用CAPS的HMPP Workbench编译加了OpenACC指导语句的源代码时，编译器会告诉你codelet产生了。实际上产生了一个CUDA或者OpenCL的源文件，这个源文件中包含了根据你的指导语句生成的CUDA或者OpenCL的源代码。那什么是codelet呢？可以认为codelet就是数据管理+内核。一个codelet要干的事情包括两部分：申请和管理CPU和协处理器之间的存储，还有就是启动在协处理上执行的代码。</p>
<p>&nbsp;</p>
<p>work-sharing</p>
<p>&nbsp;&nbsp;&nbsp; 这个词可以理解为名词&#8220;共享工作&#8221;。如果在协处理器上的线程们执行的工作时work-sharing的，那么每个线程可以根据自己的ID在不同的数据上干了相似的工作。这个词是在使用OpenACC或者OpenHMPP移植代码的时候遇到的，它描述的是CPU的串行代码中的状态，例如：</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img onclick="this.style.display='none'; Codehighlighter1_20_36_Open_Text.style.display='none'; Codehighlighter1_20_36_Closed_Image.style.display='inline'; Codehighlighter1_20_36_Closed_Text.style.display='inline';" id="Codehighlighter1_20_36_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_20_36_Closed_Text.style.display='none'; Codehighlighter1_20_36_Open_Image.style.display='inline'; Codehighlighter1_20_36_Open_Text.style.display='inline';" id="Codehighlighter1_20_36_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_20_36_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_20_36_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>在这段代码中，a[i]的计算与a[i]之外的a的元素没有依赖性，所以，每次循环的i可以使独立的完成的，像这样的状态就是work-sharing的。还有例如规约，</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img onclick="this.style.display='none'; Codehighlighter1_27_41_Open_Text.style.display='none'; Codehighlighter1_27_41_Closed_Image.style.display='inline'; Codehighlighter1_27_41_Closed_Text.style.display='inline';" id="Codehighlighter1_27_41_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_27_41_Closed_Text.style.display='none'; Codehighlighter1_27_41_Open_Image.style.display='inline'; Codehighlighter1_27_41_Open_Text.style.display='inline';" id="Codehighlighter1_27_41_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_27_41_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_27_41_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;s</span><span style="color: #000000">+=</span><span style="color: #000000">a[i];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>虽然s的计算与i相关，但是细想一下，加法在数学上市满足交换律的，s的每次加a[i]实际上不相关的，你不管以什么顺序加和a[i]到s，解结果总是一样的。所以规约也可以理解为是worksharing 的。就说这么多吧。如果大家有什么问题，欢迎给我留言奥。<br /></p><img src ="http://www.cppblog.com/jackdongy/aggbug/193587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 11:23 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CAPS发布了完全支持OpenACC的编译器了！ </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193586.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193586.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193586.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193586.html</trackback:ping><description><![CDATA[<p>CAPS发布了自己的HMPP编译器3.1版本，全部支持OpenACC特性。大家来围观把。。</p>
<p>下面是官方的中文网站。</p><a href="http://www.caps-entreprise.com.cn/many-core/product-hmpp-v3-1.html">http://www.caps-entreprise.com.cn/many-core/product-hmpp-v3-1.html</a> <img src ="http://www.cppblog.com/jackdongy/aggbug/193586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 11:21 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPU计算的后CUDA时代-OpenACC(转)</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193585.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 03:11:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193585.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193585.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193585.html</trackback:ping><description><![CDATA[<div class="t_fsz">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_17" class="t_f"><font style="font-size: 14px"><img alt="" src="http://www.gpuworld.cn/image.php?i=%2Fymfiles%2F201112%2F1325042147.jpg&amp;w=520&amp;h=390" width="520" height="390" /></font><br /><font style="font-size: 14px">在西雅图超级计算大会（SC11）上发布了新的基于指令的加速器并行编程标准，既<a class="relatedlink" href="http://www.gpus.cn/_d272990734.htm" target="_blank">OpenACC</a>。<u><strong>这个开发标准的目的是让更多的编程人员可以用到GPU计算，同时计算结果可以跨加速器使用，甚至能用在多核CPU上</strong></u>。</font><br /><font style="font-size: 14px"><u><strong>出于显而易见的原因，NVIDIA在大力推广和支持OpenACC</strong></u>。但事实上PGI和Cray才是最早推动这项技术商业化的公司。PGI已经推出了一组非常类似的加速器指令，目前也成为了OpenACC标准的基础部分之一。Cray公司正在开发自己的OpenACC编译器，并且他的XK6客户如橡树岭国家实验室和瑞士国家超级计算机中心，预计将成为该技术的第一批超级计算机用户。</font><br /><font style="font-size: 14px">简而言之，OpenACC指令与OpenMP指令工作方式很类似，但前者特别适用于高度数据并行代码。它们可插入标准的C，C + +和Fortran程序直接指导编译器进行某些代码段的并行。编译器会特别注意数据在CPU和GPU（或其他）之间来回转移的逻辑关系，并将计算映射到适当的处理器上。</font><br /><font style="font-size: 14px">这样，开发人员就可以在现存的或者新的代码上做相对小的改动以标示出加速并行区域。由于指令设计适用于一个通用并行处理器，这样相同的代码可以运行在多核CPU、GPU或任何编译器支持的其他类型的并行硬件上。这种硬件的独立性对于HPC的用户来说特别重要，因为他们不愿意接受那种受供应商限制的，非便携式编程环境。</font><br /><font style="font-size: 14px"><u><strong>站在NVIDIA的角度，目标就是将GPU计算带入后CUDA时代。</strong></u>今天，CUDA C和CUDA Fortran广泛用于GPU编程。但是这个底层技术属于NVIDIA，对于GPU计算提供了一个相对低阶的软件模型，因此想较于<u><strong>对一般编程人员或者研究人员，CUDA的使用对于计算科学类型而言受限制程度越来越明显</strong></u>。 </font><br /><font style="font-size: 14px">受NVIDIA、AMD等支持的OpenCL同样也提供了GPU和其他加速器的并行编程框架。与CUDA不一样的是，OpenCL是个真正开放的标准。 但与CUDA相似的是，OpenCL相对底层，需要对目标处理器的内部结构有一定了解。<u><strong>因此与CUDA一样，使用OpenCL对于计算机科学家来说有很大的局限性。</strong></u>&nbsp;&nbsp;</font><br /><font style="font-size: 14px">NVIDIA公司估计这个星球上有超过10万的CUDA程序员和比较多的的OpenCL开发人员，<u><strong>但他们也意识到如果能够使GPU编程更加开放且开发界面更加友好，就会有一个更大的潜在观众。从本质上讲，他们认为OpenACC将能够被数以百万计的科学家和研究人员使用，这些人不需要关心和涉足处理器架构，也不需要关心芯片与芯片之间通信</strong></u>。</font><br /><font style="font-size: 14px">NVIDIA的Tesla业务部门的首席技术官Steve Scott总结了OpenACC目标：&#8220;我们确实想在这一点上做到大幅提高适用性和人们利用GPU的广度和深度。&#8221;</font><br /><font style="font-size: 14px">Scott表示作为高层OpenACC不会影响执行性能。这来自于他以前在Cray公司做首席技术官的经验，他遇到了基于加速器的指令代码只比手工CUDA编码的性能低5％到10％而已。据他介绍，这是相当典型的。Scott说，有些应用程序甚至做的比他们用CUDA编程要好，这受益于编译器在对某些代码进行优化的能力超越了凡人。在任何情况下，OpenACC的目的是要利用CUDA进行互操作，因此如果需要的话，可以手工调整内核，并与指令代码做无缝连接。</font><br /><font style="font-size: 14px">除了PGI和Cray公司，法国的多核软件工具的开发者CAPS公司，也签署了协议支持新的指令。这三家厂商预计在2012年上半年推出支持OpenACC的编译器。值得注意的是OpenACC支持者列表中缺少了英特尔和AMD，不过这也不会阻止PGI、CAPS或者Cray建立支持英特尔和AMD硬件的OpenACC编译器。</font><br /><font style="font-size: 14px">PGI和NVIDIA目前向开发人员推出了30天免费试用PGI的加速指令编译器。活动宣传说可以在四周之内将应用性能翻倍。上百位研究人员已经注册了申请试用，</font><br /><font style="font-size: 14px">不过对于OpenACC的支持者来说真正终结这场游戏的是将指令纳入到OpenMP标准。因为OpenACC的一部分工作来源于OpenMP，所以就意味着这件事情发生的可能性很高，不过目前没有时间表，但最有可能结合的时间是在2012年某时OpenMP 4.0发布的时候。 </font><br /></td></tr></tbody></table></div><img src ="http://www.cppblog.com/jackdongy/aggbug/193585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 11:11 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>