Tag: 优化

复制BLAS矩阵乘法性能:我能匹配吗?

背景 如果您一直关注我的post,我试图复制Kazushige Goto关于方阵乘法C = AB的开创性论文中的结果。 我在这里可以找到关于这个主题的最后一篇文章。 在我的代码版本中,我遵循Goto的内存分层和打包策略,内核使用128位SSE3内在函数计算2×8的C块。 我的CPU是i5-540M,超线程关闭。 有关我的硬件的其他信息可以在另一篇文章中找到,并在下面重复。 我的硬件 我的CPU是Intel i5 – 540M。 您可以在cpu-world.com上找到相关的CPUID信息。 微体系结构是Nehalem(westmere),因此理论上每循环每个核心可以计算4个双精度触发器。 我将只使用一个核心(没有OpenMP),因此,对于超线程关闭和4步Intel Turbo Boost,我应该看到( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP flops/core/cycle ) * ( 1 core ) = 12.27 DP Gflops的峰值( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP flops/core/cycle ) * ( 1 […]

有哪些重构方法可以减少编译代码的大小?

我有一个需要新function的传统固件应用程序。 应用程序的大小已经接近设备的有限闪存容量,并且少数新function和变量将其推向了边缘。 打开编译器优化可以解决这个问题,但客户对这样做很谨慎,因为它们过去曾导致过失败。 那么,在重构C代码以产生更小的输出时,需要注意哪些常见的事情?

什么posix_fadvise()args用于顺序文件写入?

我正在开发一个顺序写入大文件(并且根本不读取)的应用程序,我想使用posix_fadvise()来优化文件系统行为。 联机帮助页中的函数说明表明最合适的策略是POSIX_FADV_SEQUENTIAL 。 但是,Linux实现描述怀疑: 在Linux下, POSIX_FADV_NORMAL将预读窗口设置为后备设备的默认大小; POSIX_FADV_SEQUENTIAL将此大小加倍,POSIX_FADV_RANDOM完全禁用文件预读。 由于我只是在写数据(可能也会覆盖文件),所以我不期待任何预读。 我应该坚持使用POSIX_FADV_SEQUENTIAL还是使用POSIX_FADV_RANDOM来禁用它? 其他选项怎么样,比如POSIX_FADV_NOREUSE ? 或者也许不要使用posix_fadvise()来写作?

海湾合作委员会的__builtin_expect走了多远?

在回答另一个问题时,我对此感到好奇。 我很清楚 if( __builtin_expect( !!a, 0 ) ) { // not likely } else { // quite likely } 通过做一些暗示处理器/改变汇编代码顺序/某种魔术的东西,将使“非常可能”的分支更快(通常)。 (如果有人能澄清那个也很棒的魔法)。 但这是否适用于a)内联ifs,b)变量和c)除0和1以外的值? 即会 __builtin_expect( !!a, 0 ) ? /* unlikely */ : /* likely */; 要么 int x = __builtin_expect( t / 10, 7 ); if( x == 7 ) { // likely } else […]

有没有办法让这个哈希查找更快?

我要求(非常)快速处理有限范围的字符串,统计它们的值。 输入文件的格式如下: January 7 March 22 September 87 March 36 等等。 因为线宽是相同的,所以我可以简单快速读取fread ,我开发了一个完美的散列函数,但是我想知道是否有人可以提供任何关于如何使它更快的建议。 我将介绍每个建议,看看它是怎么回事。 散列函数基于月份名称,以允许将值快速分配给存储桶。 跟我来这儿。 我首先想出了完美哈希的最小字符数: January February March April May June July August September October November December 请记住,由于我拥有整个输入行,因此月份都是九个字符。 不幸的是,没有一个列标记一个月的唯一。 第1列复制J ,第2列复制a ,第3列复制r ,第4列复制u和第5列以后重复 (还有其他重复但有一个足以阻止单列散列键)。 但是,通过使用第一列和第四列,我得到值Ju , Fr , Mc , Ai , M , Je , Jy , Au , St , Oo […]

重新排列等式

我的C代码中有以下等式 k * dl * (1.0 + pHold / centre + (pHold * pHold) / (2.0 * centre * centre) – square / (2.0 * centre)) 我知道浮点除法比乘法要贵得多,而且我已经和它搏斗了一段时间。 有没有办法重新排列这个来划分一个师? 谢谢

优化Microsoft Visual Studio编译器生成的程序集

我正在开发一个矩阵乘法项目。 我已经能够编写C代码,并且我能够使用Microsoft visual studio 2012编译器为它生成汇编代码。 编译器生成的代码如下所示。 编译器使用了SSE寄存器,这正是我想要的,但它不是最好的代码。 我想优化这段代码并用C代码内联编写,但我不理解汇编代码。 基本上汇编代码仅适用于矩阵的一个维度,下面的代码仅适用于4乘4矩阵。 我怎样才能使它对n * n矩阵大小有益。 C ++代码如下所示: #define MAX_NUM 10 #define MAX_DIM 4 int main () { float mat_a [] = {1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0}; float mat_b [] = {1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, […]

内存/速度问题的一般策略

我有一个c ++代码,它运行大约200个ASCII文件,进行一些基本的数据处理,并输出一个带有(基本上)所有数据的ASCII文件。 该程序一开始运行得非常快,然后在一段时间内急剧减速,可能会逐渐减慢,然后以相当缓慢的速度进行。 即它在大约5秒钟内通过前~80个文件,在大约50秒内完成约200个文件。 每个文件基本相同。 我正在寻找有关如何追踪问题或内存泄漏的建议。 更多细节:首先我会在程序开头fopen(FILE * outputFile,“w”),最后是fclose()。 前~40个文件大约需要4秒钟; 然后大约1.5分钟~200个文件。 我想也许输出文件堵塞了内存,所以我在每次迭代时(即每次打开一个新文件时)将代码更改为fopen(outputFile,“a”),每次关闭输入文件时fclose()。如上所述,这将性能提高到约50秒。 看起来很奇怪,这个“修复”会有明显的帮助,但并非完全如此。 此外,我不是动态分配任何内存(没有调用’新’或’删除’或’免费’或其他什么)….所以我甚至不知道我怎么会有内存泄漏。 任何帮助,将不胜感激! 谢谢! 码: vector dirCon; // Uses boost::filesystem to store every file in directory bool retVal = FileSystem::getDirectoryContents(HOME_DIR+HISTORY_DIR, &dirCon, 2); int counter = 0; for(int i = 0; i < dirCon.size(); i++) { // Create output file FILE *outFile; string outputFileName […]

具有数据依赖性的for循环矢量化

我有基于BiCCG(共轭梯度)的矩阵求解器的实现,它也考虑了周期性。 碰巧的情况是,实现是计算密集型的,并且由于依赖性问题,循环不会自动向量化。 我进行了一些探索,似乎红黑高斯seidel算法比vanilla版本(也有类似的依赖性问题)更有效并行化。 可以更改此循环/算法,以便可以有效地进行矢量化吗? // FORWARD #pragma omp for schedule(static, nx/NTt) for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++) { dummy = res_sparse_s[i][j][k]; dummy -= COEFF[i][j][k][7] * RLL[i-1][j][k]; if (PeriodicBoundaryX && i==nx)dummy -= COEFF[i][j][k][8] * RLL[1 ][j][k]; dummy -= COEFF[i][j][k][2] * RLL[i][j-1][k]; if (PeriodicBoundaryY && j==ny) dummy -= COEFF[i][j][k][3] * RLL[i][1 […]

数学’pow’函数gcc的SSE向量化

我试图对包含在数学库中使用’pow’函数的循环进行矢量化。 我知道英特尔编译器支持使用’pow’作为sse指令 – 但我似乎无法使用gcc运行(我认为)。 这是我正在使用的情况: int main(){ int i=0; float a[256], b[256]; float x= 2.3; for (i =0 ; i<256; i++){ a[i]=1.5; } for (i=0; i<256; i++){ b[i]=pow(a[i],x); } for (i=0; i<256; i++){ b[i]=a[i]*a[i]; } return 0; } 我正在编译以下内容: gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis 这是在使用gcc版本4.2的os X 10.5.8上(我也使用了4.5,并且无法判断它是否已经向量化了 – 因为它根本没有输出任何内容)。 似乎没有一个循环矢量化 – […]