c – SSE内在函数中的ifelse语句

c – SSE内在函数中的ifelse语句,第1张

概述我正在尝试使用SSE内在函数优化一小段代码(我是关于该主题的完全初学者),但我有点坚持使用条件. 我原来的代码是: 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; 我正在尝试使用SSE内在函数优化一小段代码(我是关于该主题的完全初学者),但我有点坚持使用条件.

我原来的代码是:

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 incrementationoffset = _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语句,但我怀疑有一个聪明的伎俩.有谁知道如何做到这一点?

(除此之外,我的优化可能非常差 – 对它的任何建议或更正都会得到最大的同情)

解决方法 你可以完全摆脱if / else.回到我制作MMX汇编代码的日子,这是一个常见的编程活动.让我首先对“虚假”声明进行一系列转换:
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 beforeelse    c =        0 ^ (c >> 1);          // just different layoutif (c & 1)    c =  constant      ^ (c >> 1);else    c = (constant & 0) ^ (c >> 1);    // 0 == x & 0if (c & 1)    c = (constant & -1) ^ (c >> 1);   // x == x & -1else    c = (constant &  0) ^ (c >> 1);

现在两个分支只在二进制的第二个参数中有所不同,并且可以从条件本身中简单地计算,从而使我们能够摆脱if / else:

c = (constant & -(c & 1)) ^ (c >> 1);

免责声明:此解决方案仅适用于二进制补码架构,其中-1表示“所有位设置”.

总结

以上是内存溢出为你收集整理的c – SSE内在函数中的if / else语句全部内容,希望文章能够帮你解决c – SSE内在函数中的if / else语句所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存