我从这个测试中注意到了一些不正常的行为。外部循环,如果稍微修改一下,比如添加一个零,它会突然将执行时间从 ~15ms 更改为无限长的时间。执行时间根本不会线性变化——如果它不是永远持续下去,最多是 30 毫秒,至少它是零。我将堆栈大小设置为几百万,以便为堆栈分配的数组提供足够的空间,因此问题不在于引发堆栈溢出。无论如何,请测试此代码 [for Visual Studio 2012,具有自动并行化和矢量化功能]。如果您使用其他编译器,请忽略 #ifdef 和 #pragma。
我将堆栈虚拟 [保留] 和物理 [分配] 内存设置为 8000000 或更大,并将它们设置为相同的数字。为什么?如果我可以将一两个千兆字节的物理 RAM 内存分配给堆栈而不会耗尽内存,我不明白为什么我需要从磁盘中提取或分页内存。
无论如何,这是测试代码,只是一堆浪费时间的循环和数组计算。它在发布模式下运行,针对速度进行了优化。
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
int
main(void)
{
clock_t begin , end;
double time_spent;
const int *__restrict const arr1 = (int *)_alloca(300000 * sizeof(int));
const int *__restrict const arr2 = (int *)_alloca(300000 * sizeof(int));
const int *__restrict const arr3 = (int *)_alloca(300000 * sizeof(int));
int *__restrict const arr4 = (int *)_alloca(300000 * sizeof(int));
begin = clock();
{
register int i;
/*
* Add or remove a zero from this outer loop and note the
* peculiar change in execution time.
*/
for (i = 0; i < 200000; ++i) {
#pragma loop(hint_parallel(3))
#pragma loop(ivdep)
for (i = 0; i < 300000; ++i) {
arr4[i] = arr1[i] + arr2[i] * arr3[i] - i + arr1[i] + arr2[i] * arr3[i] - i - arr1[i] + arr2[i] * arr3[i] - i -
-7 * arr1[i] + arr2[i] * arr3[i] - i + arr1[i] + arr2[i] * arr3[i] - i - arr1[i] + arr2[i] * arr3[i] +
arr1[i] + arr2[i] * arr3[i] - i + arr1[i] + arr2[i] * arr3[i] - i - arr1[i] + arr2[i] * arr3[i];
}
arr4[2] = arr1[7] * arr4[888] - i;
arr4[20000] += arr3[20000] - arr2[777] * i;
}
}
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("arr[4] as integer %i \n", arr4[2]);
printf("Test1: time as a floating point type is %f \n", time_spent);
}