启用arch:SSE2会使程序变慢
Enabling arch:SSE2 makes program slower
在Visual Studio 2010上,当我在以下代码上启用增强指令集时,执行时间实际上会增加。
void add(float * input1, float * input2, float * output, int size)
{
for(int iter = 0; iter < size; iter++)
{
output[iter] = input1[iter] * input2[iter];
}
}
int main()
{
const int SIZE = 10000000;
float *in1 = new float[SIZE];
float *in2 = new float[SIZE];
float *out = new float[SIZE];
for(int iter = 0; iter < SIZE; iter++)
{
in1[iter] = std::rand();
in2[iter] = std::rand();
out[iter] = std::rand();
}
clock_t start = clock();
for(int iter = 0; iter < 100; iter++)
{
add(in1, in2, out, SIZE);
}
clock_t end = clock();
double time = difftime(end,start)/(double)CLOCKS_PER_SEC;
system("PAUSE");
return 0;
}
在启用SSE2的情况下,time
变量的时间一直是2.0
秒,但在"未设置"的情况下大约是1.7
秒。我是在Windows 7 64位,VS 2010专业版,发布配置,优化速度。
为什么启用SSE会导致更长的执行时间,有什么解释吗?
在SSE代码中将值移入和移出SSE寄存器时会产生开销,如果您只进行很少的简单计算,则可能会超过SSE的性能优势,例如您的示例。
还要注意的是,如果您的数据不是16字节对齐的,则此开销会显著增加。
IMO,依赖编译器进行这些优化通常不是一个好主意。你的代码应该运行得更快(除非编译器已经为你做了,但事实并非如此)。我建议
1确保您的阵列是16字节对齐的
2在内联添加函数中使用SSE内部函数:
#include <xmmintrin.h>
inline void add(const float * input1, const float * input2, float * output, int size)
{
// assuming here that
// - all 3 arrays are 16-byte aligned
// - size is a multiple of 4
for(int iter = 0; iter < size; iter += 4)
_mm_store_ps( output+iter, _mm_mul_ps( _mm_load_ps(input1+iter),
_mm_load_ps(input2+iter) ) );
}
如果这不能产生更快的代码,那么加载和存储确实会为单个乘法运算带来太多开销。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 启用arch:SSE2会使程序变慢
- 用icpc在Arch Linux上编译一个CGAL示例程序
- QT 5.6.1应用程序仅在x86 arch上退出插槽后崩溃,而不是x64