我无法解释(并避免)Matlab mex程序与没有Matlab接口的相应C程序之间的速度差异。 我一直在分析数值分析程序: int main(){ Well_optimized_code(); } 使用gcc 4.4针对Matlab-Mex等效编译(指向使用gcc44,这不是Matlab当前支持的版本,但出于其他原因需要): void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){ Well_optimized_code(); //literally the exact same code } 我执行的时间如下: $ time ./C_version 与 >> tic; mex_version(); toc 时间上的差异是惊人的。 从命令行运行的版本平均需要5.8秒。 Matlab中的版本在21秒内运行。 对于上下文,mex文件替换SimBiology工具箱中的算法,该算法大约需要26秒才能运行。 与Matlab算法相比,C和mex版本都使用对openMP的调用线性扩展到27个线程,但为了进行性能分析,这些调用已被禁用并注释掉。 这两个版本以相同的方式编译,除了作为mex文件编译的必要标志:-fPIC –shared -lmex -DMATLAB_MEX_FILE应用于mex编译/链接。 我删除了对mex文件的左右参数的所有引用。 也就是说它不需要输入,也没有输出,它仅用于分析。 伟大而光荣的谷歌告诉我,与位置无关的代码不应该是经济放缓的源头,而且我不知所措。 任何帮助将不胜感激, 安德鲁
我正在寻找优化这种线性搜索: static int linear (const int *arr, int n, int key) { int i = 0; while (i = key) break; ++i; } return i; } 数组已排序,函数应返回大于或等于键的第一个元素的索引。 它们的数组不大(低于200个元素),并且会为大量搜索准备一次。 如果需要,可以在第n个之后将数组元素初始化为适当的数组,如果这样可以加快搜索速度。 不,不允许二进制搜索,只允许线性搜索。 编辑 :我在博客文章中总结了有关此主题的所有知识。
现代编译器是否优化了一段代码,如if(CONSTANT) { … } ,其中CONSTANT是文字,模板参数, const变量或constexpr变量? 他们是否删除整个if(0) { … }表达式或“抛弃” if(1) { … }的if(1)部分?
省略帧指针时是否有任何实质性的优化? 如果我通过阅读本页正确理解,当我们想要避免保存,设置和恢复帧指针时,使用-fomit-frame-pointer 。 这是仅针对每个函数调用完成的吗?如果是这样,是否真的值得为每个函数避免一些指令? 优化不是一件容易的事。 除了调试限制之外,使用此选项的实际含义是什么? 我使用和不使用此选项编译了以下C代码 int main(void) { int i; i = myf(1, 2); } int myf(int a, int b) { return a + b; } , # gcc -S -fomit-frame-pointer code.c -o withoutfp.s # gcc -S code.c -o withfp.s 。 diff -u这两个文件显示以下汇编代码: — withfp.s 2009-12-22 00:03:59.000000000 +0000 +++ withoutfp.s 2009-12-22 00:04:17.000000000 +0000 […]
我想了解有关低级代码优化以及如何利用底层机器架构的更多信息。 我正在寻找关于在哪里阅读有关此主题的好指示。 更多细节: 我感兴趣的是在C / C ++等低级语言中进行科学计算(这是一个很多数字运算但不仅仅是 )的优化。 我特别感兴趣的是优化方法,这些方法并不明显,除非人们对机器的工作原理有很好的了解(我还没有)。 例如,很明显,更好的算法更快,而不知道它运行的机器的任何信息。 如果首先循环遍历列或行的矩阵,那么这一点并不明显。 (最好循环遍历矩阵,以便连续读取存储在相邻位置的元素。) 关于该主题的基本建议或文章指针是最受欢迎的。 答案 得到了许多伟大指针的答案,比我有时间阅读的要多得多。 这是所有这些的列表: 英特尔软件优化食谱 (书) 每个程序员应该了解的内存 (pdf书) 写出伟大的代码,第2卷:思考低级,写高级 (书) Agner Fog的软件优化资源 (五本详细的pdf手册) 我需要一些脱脂时间来决定使用哪一个(没有时间)。
在C中,为什么signed int比unsigned int更快? 是的,我知道这个网站已被多次询问和回答(链接如下)。 但是,大多数人都说没有区别。 我编写了代码并意外地发现了显着的性能差异。 为什么我的代码的“未签名”版本比“签名”版本慢(即使在测试相同的数字时)? (我有一个x86-64英特尔处理器)。 类似的链接 签名比无符号整数更快 无符号vs有符号整数的性能 编译命令: gcc -Wall -Wextra -pedantic -O3 -Wl,-O3 -g0 -ggdb0 -s -fwhole-program -funroll-loops -pthread -pipe -ffunction-sections -fdata-sections -std=c11 -o ./test ./test.c && strip –strip-all –strip-unneeded –remove-section=.note –remove-section=.comment ./test signed int版本 注意:如果我在所有数字上明确声明了signed int ,则没有区别。 int isprime(int num) { // Test if a signed int is prime […]
我有一个使用GCC的__uint128_t的C程序很棒,但现在我的需求已经超越了它。 我有196或256位快速算术的选择吗? 我需要的唯一操作是加法(我不需要进位,即,我将使用mod 2 ^ 192或2 ^ 256)。 速度很重要,所以如果可能的话,我不想转向一般的多精度。 (实际上我的代码确实在某些地方使用了多精度,但这是在关键循环中并且将运行数百亿次。到目前为止,多精度需要运行数万次。) 也许这很简单,可以直接编码,或者我需要找到一些合适的库。 你的建议是什么,哦Stack Overflow? 澄清:GMP对我的需求来说太慢了。 虽然我实际上在我的代码中使用了多精度,但它不在内循环中并且运行时间少于10 ^ 5次。 热循环运行更像10 ^ 12次。 当我改变我的代码(增加一个尺寸参数)以使多精度部分比单精度运行更频繁时,我的速度减慢了100倍(主要是由于内存管理问题,我认为,而不是额外的μops)。 我希望将其降低到4倍或更好。
前段时间我正在尝试编写汇编程序并将其与C程序链接,我发现我可以跳过标准的C调用序言尾声 push ebp mov ebp, esp (sub esp, 4 … mov esp, ebp) pop ebp 只是跳过这一切,只需通过esp ,就像 mov eax, [esp+4] ;; take argument mov [esp-4], eax ;; use some local variable storage 它似乎工作得很好。 为什么使用这个ebp – 可能更快地通过ebp解决或者是什么?
我有一个4×4字节块,我想使用通用硬件进行转置。 换句话说,对于字节AP,我正在寻找最有效的(就指令数量而言)的方式 ABCD EFGH IJKL MNOP 至 AEIM BFJN CGKO DHLP 我们可以假设我在内存中有指向A , E , I和M有效指针(这样从A读取32位将得到包含字节ABCD的整数)。 由于对大小和数据类型的限制,这不是此问题的重复。 我的矩阵的每一行都可以容纳32位整数,我正在寻找能够使用通用硬件快速执行转置的答案,类似于SSE宏_MM_TRANSPOSE4_PS 。
<更便宜(更快)而不是<= ,同样地, >比>=更便宜(更快)? 免责声明:我知道我可以测量,但这只会在我的机器上,我不确定答案是否可以是“特定于实现”或类似的东西。