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. scala shuffle

    val arr = (0 to 100).map(_ * 1d) /// 下面这一步只能用to不能用until,scala里面实现返回的两个Range继承路径不同,不能混用 val a_shuffle ...

  2. ScrollTo:平滑滚动到页面指定位置

    使用方法 1.准备jQuery库和scrollTo.js插件. <script type="text/javascript" src="js/jquery.js&q ...

  3. poj1543-Perfect Cubes(暴力)

    水题:求n^3 =  a^3 + b^3 + c^3 ;暴力即可 #include<iostream> using namespace std; int main(){ int n ; c ...

  4. java设计模式

    五种创建型模式: 1.工厂模式 普通工厂模式: 工厂类提供一个方法可以生产多种实现了某种接口的类 多方法工厂模式: 一个方法对应一个要生产的类 静态工厂模式: 静态方法来生产类 2.抽象工厂模式 工厂 ...

  5. [ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )

    http://www.phoronix.com/scan.php?page=news_item&px=OTI2NA Note:  Something very instersting to w ...

  6. pt-archiver使用

    pt-archiver工具其实就是用来清理,归档数据用的 一.归档前的准备需要配置client字符集为utf-8,如果你用了utf-8的编码,防止归档数据为乱码[client]default-char ...

  7. UIKit的外观属性及方法汇总

    本文授权转载,作者:楚天舒(简书) 开发中经常会碰到要设置UI的某个生僻的外观属性,虽然在头文件中都能查到,但一是每个控件的头文件比较分散繁杂,二是每个头文件里有太多不用到的方法和属性,所以这里将UI ...

  8. eclipse安装svn进行版本控制

    1)通过help->installsoft->svn->add 填入http://subclipse.tigris.org/update_1.8.x 选择这两个,等其下载 2)配置一 ...

  9. 初识django

    一 从下面开始 所有的的web应用其实就是就是一个socket服务器,浏览器是一个web客户端. import socket def handle_request(client): buf = cli ...

  10. spring boot + gradle[草稿]

    入门文档:https://github.com/qibaoguang/Spring-Boot-Reference-Guide 安装gradle 官方下载 https://gradle.org/grad ...