Tag: 优化

高效计算32位整数乘法的高阶位

许多CPU具有单个汇编操作码,用于返回32位整数乘法的高阶位。 通常将两个32位整数相乘会产生64位结果,但如果将其存储为32位整数,则会将其截断为低32位。 例如,在PowerPC上, mulhw操作码在一个时钟中返回32×32位乘法的64位结果的高32位。 这正是我正在寻找的,但更便携。 在NVidia CUDA中有一个类似的操作码,umulhi()。 在C / C ++中,有没有一种有效的方法来返回32×32乘法的高阶位? 目前我通过转换为64位来计算它,例如: unsigned int umulhi32(unsigned int x, unsigned int y) { unsigned long long xx=x; xx*=y; return (unsigned int)(xx>>32); } 但这比常规的32乘32乘以慢11倍,因为即使是乘法,我也使用了过度的64位数学运算。 有更快的方法来计算高阶位吗? 使用BigInteger库显然无法解决这个问题(这样做太过分了,并且会产生巨大的开销)。 SSE似乎有PMULHUW ,16×16 – > 16位版本,但不是32×32 – > 32版本,就像我在寻找。

循环提升仍然是C代码的有效手动优化吗?

使用最新的gcc编译器,我还需要考虑这些类型的手动循环优化,还是编译器会为我做好充分的处理?

在C中,访问我的数组索引更快或通过指针访问更快?

在C中,访问数组索引更快或通过指针访问更快? 我的意思是更快,哪一个会占用更少的时钟周期。 该数组不是常量数组。

在包装的SSE浮标上翻转标志

我正在寻找在SSE寄存器中打包的所有四个浮点数上翻转符号的最有效方法。 我没有在英特尔架构软件开发手册中找到这样做的固有内容。 以下是我已经尝试过的事情。 对于每个案例,我在代码上循环了100亿次并且显示了挂号时间。 我试图至少匹配4秒,这需要我的非SIMD方法,这只是使用一元减号运算符。 [48秒] _mm_sub_ps( _mm_setzero_ps(), vec ); [32秒] _mm_mul_ps( _mm_set1_ps( -1.0f ), vec ); [9秒] union NegativeMask { int intRep; 漂浮fltRep; } negMask; negMask.intRep = 0x80000000; _mm_xor_ps(_mm_set1_ps(negMask.fltRep),vec); 编译器是带有-O3的gcc 4.2。 CPU是英特尔酷睿2双核处理器。

我可以依靠我的编译器来优化const char *上的strlen吗?

在我的SAX xml解析回调(XCode 4,LLVM)中,我正在对这种类型的代码进行大量调用: static const char* kFoo = “Bar”; void SaxCallBack(char* sax_string,…..) { if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0) { } } 假设strlen(kFoo)由编译器优化是否安全? (Apple示例代码已经预先计算了strlen(kFoo),但我认为这对于大量常量字符串很容易出错。) 编辑:优化的动机:使用NSXMLParser在iPod touch 2G上解析我的SVG地图需要5秒钟(!)。 所以,我想切换到lib2xml,并优化字符串比较。

拼图:在一个解析中对0和1的数组进行排序。

是否可以在一个解析中按顺序排列仅由1和0组成的数组而不使用辅助数组? 例如:假设你有一个数组a[]={1,0,0,0,1,0,1} ,为此预期的输出将是a[]={1,1,1,0,0,0,0} 。 我编写了下面的C代码,但它在2个解析中找到了解决方案。 可以优化吗? void arrange(int a[],int n) { int i,count=0; for(i=0;i<n;i++) { if(a[i]==1) count++; a[i]=0; } for(i=0;i<count;i++) { a[i]=1; } }

SIMD代码比标量代码运行得慢

elma和elmc都是unsigned long数组。 res1和res1也是如此。 unsigned long simdstore[2]; __m128i *p, simda, simdb, simdc; p = (__m128i *) simdstore; for (i = 0; i > l) & 15; u2 = (elmc[i] >> l) & 15; for (k = 0; k < 20; k++) { //res1[i + k] ^= _mulpre1[u1][k]; //res2[i + k] ^= _mulpre2[u2][k]; simda = _mm_set_epi64x (_mulpre2[u2][k], […]

如果指针已经标记为const,是否限制C中的帮助?

只是想知道:当我向指针添加restrict时,我告诉编译器指针不是另一个指针的别名。 我们假设我有一个类似的函数: // Constructed example void foo (float* result, const float* a, const float* b, const size_t size) { for (size_t i = 0; i < size; ++i) { result [i] = a [0] * b [i]; } } 如果编译器必须假设result可能与a重叠,则每次都必须重新获取。 但是,作为a标记为const ,编译器也可以假设a是固定的,因此一次获取它就可以了。 问题是,在这种情况下,使用restrict的推荐方法是什么? 我当然不希望编译器每次都重新获取,但我找不到有关如何在这里使用restrict好信息。

针对Core 2或Core i7架构进行全面优化的memcpy / memmove?

具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据维基百科关于架构的文章 ,每秒10+或20+千兆字节。 但是,库存memcpy()调用不会达到此目的。 (3 GB / s是我在这样的系统上看到的最高。)可能,这是由于OS供应商要求memcpy()根据处理器的特性针对每个处理器线进行调整,因此库存memcpy()实现在众多品牌和产品线上应该是合理的。 我的问题:是否有可以在C程序中使用的Core 2或Core i7处理器的免费高度调整版本? 我确信我不是唯一一个需要一个人的人,对每个人来说微量优化他们自己的memcpy()将是一个很大的浪费。

如何在c中查看优化代码

我可以使用分析器,可执行文件的大小和执行时间来检查优化。 我可以得到优化的结果。 但我有这些问题, 如何获得优化的C代码。 C使用哪种算法或方法来优化代码。 提前致谢。