Tag: 优化

用于高性能加法和乘法的常量forms

我需要在循环中有效地将一些常量添加或乘以double类型的结果以防止下溢。 例如,如果我们有int,则乘以2的幂会很快,因为编译器将使用位移。 有效的double加法和乘法是否有一种常量forms? 编辑:似乎没有多少人理解我的问题,为我的邋iness道歉。 我会添加一些代码。 如果a是int,则(乘以2的幂)将更有效 int a = 1; for(…) for(…) a *= somefunction() * 1024; 比1024更换为1023时。不确定如果我们想要添加到int中最好的是什么,但这不是我感兴趣的。 我对a是双倍的情况感兴趣。 我们可以有效地添加和乘以双精度的常数forms (例如2的幂)是什么? 常量是任意的 ,只需要足够大以防止下溢。 这可能不仅限于C和C ++,但我不知道更合适的标签。

‘memcpy’式函数支持各个位的偏移量?

我正在考虑解决这个问题,但它看起来是一项相当艰巨的任务。 如果我自己拿这个,我可能会用几种不同的方式写出并选择最好的,所以我想我会问这个问题,看看是否有一个好的图书馆已经解决了这个问题,或者是否有人有想法/建议。 void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size) { // Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer // needs to be up to one byte longer than it would need to be in memcpy. // Maybe explicitly providing the end of the buffer is best. // Also […]

优化sympy生成的代码

使用SymPy查找衍生物(请参阅此问题: https : //math.stackexchange.com/questions/726104/apply-chain-rule-to-vector-function-with-chained-dot-and-cross-product ),我想出了这段代码: from sympy import * from sympy.physics.mechanics import * from sympy.printing import print_ccode from sympy.utilities.codegen import codegen x1, x2, x3 = symbols(‘x1 x2 x3’) y1, y2, y3 = symbols(‘y1 y2 y3’) z1, z2, z3 = symbols(‘z1 z2 z3’) u = ReferenceFrame(‘u’) u1=(ux*x1 + uy*y1 + uz*z1) u2=(ux*x2 + uy*y2 + uz*z2) […]

使用数组限制?

有没有办法告诉C99编译器我要访问给定数组的唯一方法是使用myarray [index]? 说这样的话: int heavy_calcualtions(float* restrict range1, float* restrict range2) { float __I promise I won’t alias this__ tmpvalues[1000] = {0}; …. heavy calculations using range1, range2 and tmpvalues; …. } 通过使用restrict我承诺我不会为range1和range2设置别名但是如何为我的函数内部声明的数组做同样的事情?

如何在位图中的位之间插入零?

我有一些性能很重的代码执行位操作。 它可以简化为以下明确定义的问题: 给定一个13位位图,构造一个26位位图,其中包含在偶数位置间隔的原始位 。 为了显示: 0000000000000000000abcdefghijklm (input, 32 bits) 0000000a0b0c0d0e0f0g0h0i0j0k0l0m (output, 32 bits) 我目前在C中以下列方式实现它: if (input & (1 << 12)) output |= 1 << 24; if (input & (1 << 11)) output |= 1 << 22; if (input & (1 << 10)) output |= 1 << 20; … 我的编译器(MS Visual Studio)将其转换为以下内容: test eax,1000h jne 0064F5EC […]

为空间优化一系列tribools

让我先从一些背景知识开始: 通过“tribool”,我理解一个可以包含以下值之一的变量: true , false或null 。 有问题的是复制int的数组和指向 bool的指针 ,OP希望有一个尽可能小的tribools数组(或多或少)。 使用“一点点”最基本的bit-fu,我提出了一个解决方案,每个tribool使用2位,并允许以16字节存储OP的64个tribool数组,这是可以的。 我使用的tribool机制非常简单,如: boolean A表示“null或not null”, boolean B表示“如果不为null则为true或false”。 但后来我想……一个“位”的算法定义是: 一位是指定两个同等可能事件中的哪一个应发生的信息量。 显然,真/假值是1位大。 两个真假值整体上是2位大。 那么我们的概念摩擦呢呢? 我的观点是: 就所包含信息的大小而言,tribool大于1位但小于2位 。 理由1:假设我们实现了如上所述的if boolean。 如果布尔A为“null”,则布尔值B的值是多余的,并且不携带任何相关信息。 理由2:在一个tribool中存储来自2个独立布尔值的信息是不可能的,所以它有 (以上都不是正式的证据,但我相信我们可以同意关于tribool的“大小”严格大于1位且严格小于2。) 我的问题是: 如何以编程方式利用tribool信息少于2位的事实,并在软件 (c,c ++?)中实现一个N triboolsarrays,对于某些N,其内存占用量小于N/4字节? 是的,我确实理解这样的实现并不是真正的硬件友好,并且执行速度比任何具有冗余的常见解决方案都要慢(如OP的问题所示)。 让我们优化空间,而不是效率。 很明显,这种实现需要一种摩博尔的不同表示而不是一对bool(这本身就是多余的,如前所述)。 该理论认为可以实现这一目标,我希望看到实际的实施。 有任何想法吗?

gcc能否根据条件优化我的周期?

我有以下周期: //condition will be set here to true or false for (int i = 0; i < LARGE_NUMBER; i++) { if (condition) { //do foo } else { //do bar } } 假设:没有条件而不是条件的周期更快。 (这是真的吗?)问题:如果condition已经设置在for循环之外,并且循环本身没有触及condition ,那么gcc会将我的if ,if 如果没有,我应该切换if和for ,重复代码,违反DRY等。

计算距离平方的最快方法

我的代码在很大程度上依赖于计算3D空间中两点之间的距离。 为了避免昂贵的平方根,我使用整个平方距离。 但它仍然占用了计算时间的很大一部分,我想用更快的东西替换我的简单函数。 我现在有: double distance_squared(double *a, double *b) { double dx = a[0] – b[0]; double dy = a[1] – b[1]; double dz = a[2] – b[2]; return dx*dx + dy*dy + dz*dz; } 我也尝试使用宏来避免函数调用,但它没有多大帮助。 #define DISTANCE_SQUARED(a, b) ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2]) 我考虑过使用SIMD指令,但找不到一个好的例子或完整的指令列表(理想情况下是一些乘法+加两个向量)。 GPU不是一个选项,因为每个函数调用只知道一组点。 计算距离平方的最快方法是什么?

快速向后转动大块内存

我需要以相反的顺序重写大约4KB的数据,在位级(最后一个字节的最后一位成为第一个字节的第一位),尽可能快。 有没有聪明的小册子呢? 理由:数据是嵌入式设备中LCD屏幕的显示内容,通常以屏幕位于肩膀上的方式定位。 屏幕有“6点钟”的方向,可以从下面看 – 像平躺或挂在眼睛上方。 这可以通过将屏幕旋转180度来固定,但是我需要从屏幕的左上角开始反转屏幕数据(由库生成),即1位= 1像素。 CPUfunction不是很强大,设备已经有足够的工作量,加上一秒钟的几帧,所以性能是个问题; RAM不是那么多。 编辑:单核,ARM 9系列。 64MB,(缩小到32MB以后),Linux。 数据通过8位IO端口从系统存储器推送到LCD驱动器。 CPU为32位,在字长方面的性能要比字节级高得多。

如何优化这个Langton的antsim?

我正在写一个Langton的antsim(用于规则字符串RLR),我正在尝试优化它以提高速度。 这是相关的代码: #define AREA_X 65536 #define AREA_Y 65536 #define TURN_LEFT 3 #define TURN_RIGHT 1 int main() { uint_fast8_t* state; uint_fast64_t ant=((AREA_Y/2)*AREA_X) + (AREA_X/2); uint_fast8_t ant_orientation=0; uint_fast8_t two_pow_five=32; uint32_t two_pow_thirty_two=0;/*not fast, relying on exact width for overflow*/ uint_fast8_t change_orientation[4]={0, TURN_RIGHT, TURN_LEFT, TURN_RIGHT}; int_fast64_t* move_ant={AREA_X, 1, -AREA_X, -1}; … initialise empty state while(1) { while(two_pow_five–)/*removing this by […]