随着C++编译器的快速发展,尤其是英特尔编译器,以及在C/C++代码中直接应用SIMD函数的能力,Fortran在数值计算领域仍然具有任何真正的优势吗?
我来自应用数学背景,我的工作涉及大量的数值分析,计算,优化等,具有严格定义的性能要求.
我对Fortran几乎一无所知,我在C/CUDA/matlab方面有一些经验(如果你认为后者是一种计算机语言),我的日常任务包括分析非常大的数据(例如10GB大的矩阵),并且看起来该程序至少花费2/3的时间来访问内存(这就是为什么我将其部分工作发送到GPU),你是否认为对我来说至少尝试Fortran例程可能是值得的我的代码中一些性能至关重要的部分,以提高我的程序的性能?
因为那里需要完成复杂性和事情,所以如果只有那里有显着的性能优势,我只会这样做,感谢提前.
以下代码是仅仅并行化第一个(外部)循环,还是并行化整个嵌套循环?
#pragma omp parallel for
for (int i=0;i<N;i++)
{
for (int j=0;j<M;j++)
{
//do task(i,j)//
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想确定上面的代码是否会并行化整个嵌套的for循环(因此一个线程直接相关的任务(i,j)),或者它只是并行化外部for循环(因此它确保了每个并行)带有循环索引i的线程,它的内部循环将在一个线程中顺序完成,这非常重要).
处理非常大的bool数据集,尝试使用逐位操作来处理它,寻找一些处理bit-set的库,它可以:
显然std::bitset
,任何建议的功能都太有限了吗?
CUDA中是否有任何设备功能可以获得IEEE 754特殊值,如inf,NaN?我的意思是稳定的方式,而不是一些可以由编译器优化的数学运算.
我只设法找到一个名为nan()的设备函数,它必须采用一些未知的字符串参数.
我需要在GPU上进行大量的逐位操作,但无法找到有关Nvidia硬件是大端还是小端的任何信息.
我即将为实时应用编写一个algorthim,它涉及一些高维NLP(非线性编程).
在实现之前,我需要对算法进行计时,以确定它是否适用于实时应用程序,因此我使用Matlab的内置fmincons作为基线.
根据经验表明,matlab算法的速度往往从慢到低于C++对应物,所以我想估计一下这种特殊情况可以带来什么样的性能提升?
由于我的工作主要与实时应用程序有关,因此我很少使用NLP(非线性编程),所以我问我的同事们,他们建议我尝试ipopt作为开始,我google了它的网站,没有针对Matlab的基准测试关于算法细节也没有太多话题(至少在Matlab中,检查它们的算法的细节并不难),所以我基本上对它的准确性/鲁棒性/最优性等几乎一无所知.
所以关于NLP的C++实现的任何帮助都将非常有用,非常感谢提前.
我听说有一些方法可以修改Linux的这样一个特定的应用程序能获得非常低的延迟,使得whenver要求它的资源,操作系统将尝试尽快给它的资源,一种覆盖默认的抢占式多任务机制,我没有CS背景,但我正在处理的应用程序对延迟非常敏感,任何人都可以告诉我这个具体问题是否有任何文档/内容?非常感谢.
当从matlab调用外部C库(DLL)时,似乎matlab将首先尝试filename_thunk_pcwinXX.dll
在临时目录中生成名为(其中XX依赖于OS的32或64)的thunk文件.
在matlab文档中,它提到该文件是外部DLL和Matlab之间的接口,因此它不包含原始外部DLL的任何其他数据.
问题是,我编写了一个库,在运行时可能会调用其他库,matlab总会给我一些奇怪的结果,甚至在库调用某些库时崩溃(不是全部,我的库和其他库都是64位) DLL).
当从其他C/C++程序而不是matlab调用时,我的所有库函数都可以正常工作.
我只是想知道,为了让matlab正常工作,我的库在运行时调用的其他库是否也需要得到某种thunk文件?我简直无法相信,但我不知道matlab如何处理外部库的确切方法.
为了满足某些商业应用的要求,我们需要一些非常紧凑的C/C++,它应该是:
体积小,越小越好,越绿越好(理想情况下,编译器不应要求安装过程变得可行).
可以编译到x86和x86-64程序,同时针对Windows和Linux平台.
编译器仅用于编译非常短的C/C++程序(例如,不超过20行),但编译时间应尽可能短(这是一个关键要求.)
它的所有功能都应该通过命令行输入来设置(我猜每个编译器都可以这样做).
拥有易于访问的配置文件.
可以接受Boost和流行的数学库.
我不需要高级C++功能(例如C++/99).
在代码优化方面,如果编译器可以优化代码,那么它是一个优点,但它不是必需的.
理想情况下,最好是可以免费进行重新分配,但是liscence-fee也是可以接受的,但我们更喜欢一次性付款方式而不是按项目/复制方式.
我们获得了一个内部产品,但是对其他选项开放,无论是否免费.提前谢谢了.
需要在matlab和一些DLL函数之间来回传递一些数据,有一点可以看出我们在matlab中不知道NaN的精确数值,因此会有一些不必要的数据处理来考虑这些值.
有人知道matlab中NaN的确切值或至少值的范围吗?
我最感兴趣的是了解以下两种主要类型:
(1)浮法NaN(32);
(2)NaN为双(64).