【发布时间】:2011-09-11 12:55:54
【问题描述】:
我正在尝试使用 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, 2, 1, 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 语句,但我怀疑有一个聪明的技巧。有没有人知道如何做到这一点?
(除此之外,我的优化可能很差 - 任何关于它的建议或更正都会受到最大的同情)
【问题讨论】:
-
如果循环不是很大,那么你应该尽量保持外循环小于内循环。这将导致内部循环的初始化较少(即它应该是
n < 8和k < 64) -
for语句使用分号而不是逗号来分隔其组成部分。 -
@Fred,哎呀,当我复制到编辑器时出错,已更正。谢谢。
-
难道您不能直接使用称为“复制粘贴”的传统方法,而不是自己重新输入代码吗?堆栈溢出编辑器确实支持 Ctrl+V,你知道 ;)
-
这复制粘贴的东西听起来是个高端技术,估计不太靠谱。当早期采用者对其进行彻底测试时,我将使用它。
标签: c++ if-statement sse intrinsics mmx