在C中翻转数组中某些元素符号的最快方法

在C中翻转数组中某些元素符号的最快方法,c,arrays,C,Arrays,我有一个数组a,它是维度d的双倍数(它是2的幂,假设在64到1024之间)。 现在我想以1/2的概率翻转每个元素的符号(并记住已翻转的位置!) 我现在要做的是生成第二个只有1和-1的double数组b,然后: for (int i=0; i<d; i++) a[i] = a[i]*b[i]; 用于(int i=0;iThere’s,尽管它最终可能会比循环乘法慢,我认为这是SIMD优化的主要目标。虽然将符号存储在单个位可能更高效,但它可能会导致运行时更差,因为单个位可能更难在内存中寻址。另

我有一个数组
a
,它是维度d的双倍数(它是2的幂,假设在64到1024之间)。 现在我想以1/2的概率翻转每个元素的符号(并记住已翻转的位置!)

我现在要做的是生成第二个只有1和-1的double数组
b
,然后:

for (int i=0; i<d; i++) a[i] = a[i]*b[i];

用于(int i=0;iThere’s,尽管它最终可能会比循环乘法慢,我认为这是SIMD优化的主要目标。虽然将符号存储在单个位可能更高效,但它可能会导致运行时更差,因为单个位可能更难在内存中寻址。另一方面,h而且,可以将一批符号加载到寄存器中,这些符号可以“移出”并用于分支。Ilja Everilä的注释非常有用;您能够显式使用SIMD宏进行乘法还是需要纯C?对于SIMD,数组还必须与偶数内存地址对齐;y需要什么体系结构ou target?在通过双精度数组表示符号和将符号表示为位向量之间,有一种方法将符号表示为
有符号字符的数组
。这将比前一种形式更紧凑,以便更好地使用缓存,并且与后一种形式相比,提取信息所需的操作更少。与大多数pe一样但是,性能问题最终需要测试以确定哪种方法对您最快。只要您运行此操作的平台与任何PC一样具有硬件浮点支持,则执行浮点操作的速度非常快。第二个示例的一个问题是如果
b[]
仍然是一个浮点数组,然后你有一个浮点运算来进行比较,然后有一半的时间用另一个浮点运算来改变符号。虽然它可能会比循环乘法慢,我想这是SIMD优化的主要目标。在存储符号时单个位中的s可能更高效,这可能会导致运行时更糟糕,因为单个位可能更难在内存中寻址。另一方面,可以将一批符号加载到寄存器中,这些符号可以“移出”并用于分支。Ilja Everilä的注释非常有用;您是否能够要显式使用SIMD宏进行乘法,还是需要纯C?对于SIMD,数组还必须与偶数内存地址对齐;您的目标是什么体系结构?在通过双精度数组表示符号和将符号表示为位向量之间,有一种方法是将它们表示为
带符号字符的数组
。这将比前一种形式更紧凑,以便更好地使用缓存,并且与后一种形式相比,提取信息所需的操作更少。但是,与大多数性能问题一样,您最终需要进行测试,以确定哪种方法对您来说最快。只要您运行此功能的平台具有硬件flo与任何PC一样,支持浮点运算的速度非常快。第二个示例的一个问题是,如果
b[]
仍然是浮点数组,则需要进行浮点运算来进行比较,然后有一半的时间需要进行另一个浮点运算来更改符号。
for (int i=0; i<d; i++){
    if (b[i]<0)
        a[i]=-a[i];
}