C#的优雅,强大IDE的支持,.net下各语言的二进制兼容,自从第一眼看到C#就被其良好的设计吸引。一直希望将其应用于高性能计算领域,长时间努力却效果却不尽如人意。

对于小的测试代码用例而言,C#用20-30%的性能损耗换取良好的开发维护体验倒是非常值得。

但FEM/CFD/SPH求解器的实际开发中,作为典型的运算密集型项目,对性能极其敏感。即使是单线程,未作充分优化前提下,运算耗时:

C#:ASC C 未优化= 2:1

C#:ASC C 充分优化= 4:1   如手工循环展开,内联优化等

ASC C优化 :C++11 优化= 1:1   到1.1 :1  说明相同编译器C 89 和C++ 11在该领域性能相当

C++11 x86 优化:C++11 x64 优化= 1 : 1.1  64bit性能略高

C++11 优化:Fortran 95默认 = 1.5 :1

也就是说C++11 充分优化后的代码居然比Fortran 95的默认还慢了不少,而C#默认编译的只有C++11优化后的1/4, Fortran的1/6 ,  而且C#的优化空间还很小。

付出了这么多精力,得到的结果却如此,难道还得继续用VIM编写Fortran代码(intel fortran 2013后对VS的支持有所提升,但还是适合自行配置VIM来开发)

对于GPU和异构计算领域,也尝试了C#,可以使用,但也是难以发挥硬件的极致性能。

并行计算的话C++ PPL 与C# TPL 在形式上非常接近,为啥性能上却相差那么大呢。

追求极限GPU性能的话CUDA >OpenCL >C++AMP = OpenACC

当然灵活性也逐渐递减。

为了让C#适用于高性能计算的话,一个思路是仅仅利用语法规则,而不使用默认的编译器,严格限定使用少量几个语法,自行开发编译前端将C#语言转译成C再编译,但开发者需要自行确保无读写访问冲突。

另一个思路是仿照CUDA/OpenCL、,将运算密集型部分抽出,转译成GPU执行,由于热点部分部分代码规模较小,可限定语法为C的子集。

但在实际应用上,两个思路也都困难重重,并且放弃了调试的便利。

哎,C#高性能计算,想说爱你不容易。

C#在高性能计算领域为什么性能却如此不尽人意的更多相关文章

  1. 2019-2020春江云暖你先知,CAE/EDA/高校等CloudHPC领域年均复合增长率超21%

    原创: 灵魂工作室 速石科技 我猜,我们是最早和你说春天来了的人. 一年前,我们还在小心谨慎地定义着Cloud HPC,一脸娇羞地拿Novartis 诺华制药在5年前做的案例当作标杆. 不久前,Hyp ...

  2. 通过优化在UE4中实现良好性能和高质量视觉效果

    转自:http://gad.qq.com/program/translateview/7160166 译者:赵菁菁(轩语轩缘)  审校:李笑达(DDBC4747) 对于任何追求UE4性能最佳.同时又想 ...

  3. CQRS之旅——旅程7(增加弹性和优化性能)

    旅程7:增加弹性和优化性能 到达旅程的终点:最后的任务. "你不能飞的像一只长着鹪鹩翅膀的老鹰那样."亨利·哈德逊 我们旅程的最后阶段的三个主要目标是使系统对故障更具弹性,提高UI ...

  4. java并发编程实战《七》安全性、活跃性以及性能问题

    安全性.活跃性以及性能问题 安全性问题 那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外. 存在共享数据并且该数据会发生变化,通俗地讲就是有多个线 ...

  5. [Z]CS权威会议

    CS Conference TOP 40 计算机会议TOP40 一.A 类 15 个 ASPLOS: Architecture Support for Programming Languages an ...

  6. Linux 内核的文件 Cache 管理机制介绍

    Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...

  7. 关于协程的学习 & 线程栈默认10M

    先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件 ...

  8. LibLinear(SVM包)使用说明之(一)README

    转自:http://blog.csdn.net/zouxy09/article/details/10947323/ LibLinear(SVM包)使用说明之(一)README zouxy09@qq.c ...

  9. 【转】Linux Page Cache的工作原理

    1 .前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与Windows.UNIX 一起占据了操作系统领域几乎所有的市场份额.特别是在高性能计算 ...

随机推荐

  1. xampp安装

    软件下载在以下网站 http://www.apachefriends.org/zh_cn/index.html XAMPP 是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发 ...

  2. Daily Scrum02 12.10

    不同于往常,今天我们在中午体育课后,就简单的进行了一次小组会议,主要是讨论了一下,我们的单词软件的查询功能的优化的进度与暂时达到的效果,界面的各个按钮等元素的素材的准备有点拖慢,由于要反复修改,查看效 ...

  3. 人工神经网络NN

    [面向代码]学习 Deep Learning系列 http://blog.csdn.net/coolluyu/article/details/20214617 正则化的最小二乘法 深入浅出LSTM神经 ...

  4. innerHTML、innerText、outerHTML、outerText的区别

    我们在用JS/JQ 获取或设置元素内容的时候,通常是获取或设置指定元素之间的内容 <script> //JS document.getElementById('test').innerHT ...

  5. swift-懒加载

    override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.cyan self.navi ...

  6. vi 技巧和诀窍~转IBM

    复合搜索 1 #!/bin/ksh 2 # 3 echo "Starting" 4 file=${1} 5 6 echo ${file} 7 8 if [[ ${file} = 1 ...

  7. eclipse导入项目后,java文件无法编辑的问题

    新公司第一天,从svn checkout maven项目后,导入eclipse,发现文件的图标不对,如下图箭头所示,出现这个问题的原因, 是项目的的目录下没有.classpath文件,所以需要执行下m ...

  8. 带你玩转JavaWeb开发之六-mysql基本语法详解及实例(3)

    [语法] update 表名 set 列名=列值,列名=列值 -[条件]; [注意事项] * 修改的列的值需要与列的类型一致. * 修改的列的值的长度不能超过列的类型的最大长度. * 字符串类型和日期 ...

  9. .csv导入mysql时出现乱码

  10. eclipse下SVN同步时忽略target文件夹

    直接干货:window-->preferences-->team-->Ignored Resource-->Add Pattern-->新建一个*/target/*--& ...