Tag: 优化

优化磁盘IO

我有一段代码可以分析来自非常大(10-100GB)二进制文件的数据流。 它运行良好,所以是时候开始优化了,目前磁盘IO是最大的瓶颈。 有两种类型的文件正在使用中。 第一种类型的文件由16位整数流组成,必须在I / O之后进行缩放,以转换为物理上有意义的浮点值。 我以块的forms读取文件,并通过一次读取一个16位代码,执行所需的缩放,然后将结果存储在数组中来读取数据块。 代码如下: int64_t read_current_chimera(FILE *input, double *current, int64_t position, int64_t length, chimera *daqsetup) { int64_t test; uint16_t iv; int64_t i; int64_t read = 0; if (fseeko64(input, (off64_t)position * sizeof(uint16_t), SEEK_SET)) { return 0; } for (i = 0; i < length; i++) { test = fread(&iv, sizeof(uint16_t), 1, input); […]

为什么我的8M L3缓存不能为大于1M的arrays带来任何好处?

我受这个问题的启发,编写了一个简单的程序来测试我的机器在每个缓存级别的内存带宽: 为什么矢量化循环没有性能改进 我的代码使用memset反复写入缓冲区(或缓冲区)并测量速度。 它还保存了最后打印的每个缓冲区的地址。 这是列表: #include #include #include #include #define SIZE_KB {8, 16, 24, 28, 32, 36, 40, 48, 64, 128, 256, 384, 512, 768, 1024, 1025, 2048, 4096, 8192, 16384, 200000} #define TESTMEM 10000000000 // Approximate, in bytes #define BUFFERS 1 double timer(void) { struct timeval ts; double ans; gettimeofday(&ts, NULL); ans = ts.tv_sec […]

您知道哪些技术可以避免条件分支?

有时CPU占用大部分时间的循环经常会有一些分支预测错误(错误预测)(接近.5概率)。我在非常孤立的线程上看到了一些技术但从未列出过。 我所知道的那些已经解决了条件可以变为bool并且以某种方式使用0/1来改变的情况。 是否有其他可以避免的条件分支? 例如(伪代码) loop () { if (in[i] < C ) out[o++] = in[i++] … } 可以重写,可能会失去一些可读性,用这样的东西: loop() { out[o] = in[i] // copy anyway, just don’t increment inc = in[i] < C // increment counters? (0 or 1) o += inc i += inc } 此外,我已经看到了野外技术在某些环境中改变了&&和&条件,现在正在逃避我的思绪。 我是这个优化级别的新手,但确实感觉还有更多。

截面颜色平均矩形

我写了一个快速的python脚本来返回屏幕周边的矩形的平均颜色。 (这里的最终目标是在我的显示器周围放置RGB LED条 ,以便在电影期间获得发光效果 – 像这样(youtube) ,但更有趣,因为我自己制作它)。 我目前正在使用autopy将屏幕作为位图(“屏幕截图”),获取每个像素值以及RGB HEX转换。 简化版: step = 1 width = 5 height = 5 b = autopy.bitmap.capture_screen() for block in border_block(width, height): # for each rectangle around the perimeter of my screen R,G,B = 0,0,0 count = 0 for x in xrange(block.x_min, block.x_max, step): for y in xrange(block.y_min, block.y_max, step): […]

这个数组比较问题的最佳算法是什么?

解决以下问题的速度算法最有效的是什么? 给定6个arrays,D1,D2,D3,D4,D5和D6,每个包含6个数字,如: D1[0] = number D2[0] = number …… D6[0] = number D1[1] = another number D2[1] = another number …. ….. …. …… …. D1[5] = yet another number …. …… …. 给定第二个数组ST1,包含1个数字: ST1[0] = 6 给定第三个数组ans,包含6个数字: ans[0] = 3, ans[1] = 4, ans[2] = 5, ……ans[5] = 8 使用数组D1,D2,D3,D4,D5和D6的索引,从0到存储在ST1 [0]中的数字减1,在本例6中,从0到6-1,将ans数组与每个D数组进行比较。 如果在相同索引处的任何D中找不到一个或多个ans数,则结果应为0,如果在相同索引处的某个D中找到所有ans数,则结果应为1。 也就是说,如果某些ans [i]不等于任何D […]

排序数组的最快搜索方法是什么?

回答另一个问题 ,我编写了下面的程序来比较排序数组中的不同搜索方法。 基本上我比较了插值搜索和二分搜索的两种实现。 我通过计算不同变体所花费的周期(使用相同的数据集)来比较性能。 但是我确信有一些方法可以优化这些function,使它们更快。 有没有人对如何更快地使这个搜索function有任何想法? 使用C或C ++的解决方案是可以接受的,但我需要它来处理具有100000个元素的数组。 #include #include #include #include #include static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile (“.byte 0x0f, 0x31” : “=A” (x)); return x; } int interpolationSearch(int sortedArray[], int toFind, int len) { // Returns index of toFind in sortedArray, or -1 if not […]

击败或满足OS X memset(和memset_pattern4)

我的问题是基于另一个SO问题: 为什么_mm_stream_ps会产生L1 / LL缓存未命中? 在读完它并被它吸引之后,我试图复制结果,看看自己哪个更快:天真循环,展开的幼稚循环, _mm_stream_ps (展开), _mm_stream_ps (展开)和最后但并非最memset_pattern4 。 (最后一个采用4字节模式,例如浮点数,并在目标数组上填充它,这应该与所有其他函数相同,但它可能是OS X独有的)。 我已确保将数组的开头对齐在高速缓存行(64字节,我检查过),并在参数中传递数组以及上一个问题中提到的任何其他性能调整。 有人想在gamedev上知道同样的事情: http ://www.gamedev.net/topic/532112-fast-memset/ 该线程的结论反映了我自己: 当目标arrays小于最大(L3)缓存时, _mm_store_ps比_mm_stream_ps快。 当目标数组较大时, _mm_stream_ps更快 。 我不完全确定为什么__mm_store_ps在第一种情况下更快,因为我从不在缓存中使用这些值,但我明白为什么_mm_stream_ps在后一种情况下胜出。 它适用于这种情况:将字节写入内存,您不需要立即(或永远)。 以下是目标数组比L3缓存大256倍(在我的情况下,1.5GB),使用gcc 4.8编译的结果: gcc-4.8 stream.c -o stream -std=c11 -O3 -g3 -ftree-vectorize -march=native -minline-all-stringops && ./stream bench L3-MASS, array 1610612736 bytes (402653184 floats, 0 remainder, 0x104803040 pointer) warm up round… 6% ( 20.81148 […]

优化我! (C,表现) – 跟随苦涩的问题

感谢bit Twiddling的一些非常有用的stackOverflow用户:设置了哪个位? ,我已经构建了我的函数(在问题的最后发布)。 任何建议 – 即使是小建议 – 将不胜感激。 希望它能使我的代码变得更好,但至少它应该教会我一些东西。 🙂 概观 此function将被调用至少10 13次,并且可能经常被调用10 15次 。 也就是说,此代码很可能会运行数月 ,因此任何性能提示都会有所帮助。 此function占计划时间的72-77%,基于分析和不同配置中的大约十二次运行(优化此处不相关的某些参数)。 此function目前平均运行50个时钟。 我不确定这可以改进多少,但我很高兴看到它在30岁时运行。 重点观察 如果在计算的某个时刻你可以告诉你将返回的值很小(准确值可协商 – 比如说,低于一百万) 你可以提前中止 。 我只对大价值感兴趣。 这就是我希望节省大部分时间的方式,而不是通过进一步的微观优化(尽管这些当然也是受欢迎的!)。 绩效信息 smallprimes是一个位数组(64位); 平均大约8位将被设置,但它可以少至0或多达12。 q通常是非零的。 (请注意,如果q和smallprimes为零,则函数会提前退出。) r和s通常为0.如果q为零,r和s也将为0; 如果r为零,则s也是如此。 正如最后的评论所说,nu到底通常是1,所以我有一个有效的特殊情况。 特殊情况下的计算可能会出现溢出风险,但通过适当的建模我已经certificate,对于我的输入,这不会发生 – 所以不要担心这种情况。 此处未定义的function(ugcd,minuu,star等)已经过优化; 无需花很长时间才能运行。 pr是一个小数组(全部在L1中)。 此外,这里调用的所有函数都是纯函数 。 但是如果你真的在乎… ugcd是gcd ,minuu是最小值,vals是尾随二进制0的数量,__ builtin_ffs是最左边的二进制1的位置,star是(n-1)>> vals(n- 1),pr是从2到313的素数数组。 目前正在Phenom II 920 x4上进行计算,尽管对i7或Woodcrest的优化仍然很有意义(如果我在其他节点上获得计算时间)。 我很乐意回答您对该function或其成员的任何问题。 […]

C中双精度数组的优化和

我有一个任务,我必须采取一个程序,并使其在时间上更有效。 原始代码是: #include #include // You are only allowed to make changes to this code as specified by the comments in it. // The code you submit must have these two values. #define N_TIMES 600000 #define ARRAY_SIZE 10000 int main(void) { double *array = calloc(ARRAY_SIZE, sizeof(double)); double sum = 0; int i; // You can […]

提高C循环的效率

我有一些工作的C代码,我希望提高效率。 我知道最好避免循环中的if语句但是我在这里努力解决这个问题。 任何人都可以建议我如何使以下代码更有效? for(iy=0;iy<Ny;iy++) { for(ix=0;ix<Nx;ix++) { if (ix==0) { pudx = (u[1][iy] + u[Nx-1][iy] – 2.0*u[0][iy])/(calc1); } else if (ix==Nx-1) { pudx = (u[0][iy] + u[Nx-2][iy] – 2.0*u[Nx-1][iy])/(calc1); } else { pudx = (u[ix+1][iy] + u[ix-1][iy] – 2.0*u[ix][iy])/(calc1); } if (iy==0) { pudy = (u[ix][1] + u[ix][Ny-1] – 2.0*u[ix][0])/(calc2); } else if (iy==Ny-1) { […]