大佬教程收集整理的这篇文章主要介绍了c – SSE内在函数中的if / else语句,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我原来的代码是:
unsigned long c; unsigned long constant = 0x12345678; unsigned long table[256]; int n,k; for( n = 0; n < 256; n++ ) { c = n; for( k = 0; k < 8; k++ ) { if( c & 1 ) c = constant ^ (c >> 1); else c >>= 1; } table[n] = c; }
这段代码的目标是计算一个crc表(常量可以是任何多项式,它在这里不起作用),
__m128 x; __m128 y; __m128 *table; x = _mm_set_ps(3,2,1,0); y = _mm_set_ps(3,0); //offset for incrementation offset = _mm_set1_ps(4); for( n = 0; n < 64; n++ ) { y = x; for( k = 0; k < 8; k++ ) { //if Do something with y //else do something with y } table[n] = y; x = _mm_add_epi32 (x,offset); }
我不知道如何通过if-else语句,但我怀疑有一个聪明的伎俩.有谁知道如何做到这一点?
(除此之外,我的优化可能非常差 – 对它的任何建议或更正都会得到最大的同情)
c >>= 1; c = c >> 1; c = 0 ^ (c >> 1);
我为什么要介绍独家或?因为在“真实”声明中也可以找到exclusive或者:
c = constant ^ (c >> 1);
注意相似性?在“真实”部分中,我们用常数xor,在虚假部分中,我们xor为零.
现在,我将向您展示整个if / else语句的一系列转换:
if (c & 1) c = constant ^ (c >> 1); // same as before else c = 0 ^ (c >> 1); // just different layout if (c & 1) c = constant ^ (c >> 1); else c = (constant & 0) ^ (c >> 1); // 0 == x & 0 if (c & 1) c = (constant & -1) ^ (c >> 1); // x == x & -1 else c = (constant & 0) ^ (c >> 1);
现在两个分支只在二进制的第二个参数中有所不同,并且可以从条件本身中简单地计算,从而使我们能够摆脱if / else:
c = (constant & -(c & 1)) ^ (c >> 1);
免责声明:此解决方案仅适用于二进制补码架构,其中-1表示“所有位设置”.
以上是大佬教程为你收集整理的c – SSE内在函数中的if / else语句全部内容,希望文章能够帮你解决c – SSE内在函数中的if / else语句所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。