Ita*_*atz 8 c c++ performance visual-studio-2010
我有以下C++代码片段(C++部分是此处省略的分析器类),使用VS2010(64位Intel机器)编译.代码简单地将一个float(arr2)数组与一个标量相乘,并将结果放入另一个数组(arr1):
int M = 150, N = 150;
int niter = 20000; // do many iterations to have a significant run-time
float *arr1 = (float *)calloc (M*N, sizeof(float));
float *arr2 = (float *)calloc (M*N, sizeof(float));
// Read data from file into arr2
float scale = float(6.6e-14);
// START_PROFILING
for (int iter = 0; iter < niter; ++iter) {
for (int n = 0; n < M*N; ++n) {
arr1[n] += scale * arr2[n];
}
}
// END_PROFILING
free(arr1);
free(arr2);
Run Code Online (Sandbox Code Playgroud)
为简单起见,这里省略了从文件读取部分和分析(即运行时间测量).
当arr2初始化为[0 1]范围内的随机数时,与arr2初始化为稀疏数组的情况相比,代码运行速度快约10倍,其中约2/3的值为零.我打与编译器选项/fp和/O,这改变了运行时间一点点,但1:10的比例大约保持.
编辑
完整的代码在这里:https://gist.github.com/1676742,用于编译的命令行在注释中test.cpp.
数据文件在这里:
可能这是因为你的"快速"数据只包含正常的浮点数,但你的"慢"数据包含大量的非规范化数字.
至于你的第二个问题,你可以尝试用这个来提高速度(并将所有非规范化数字视为精确零):
#include <xmmintrin.h>
_mm_setcsr(_mm_getcsr() | 0x8040);
Run Code Online (Sandbox Code Playgroud)