0

我从这个测试中注意到了一些不正常的行为。外部循环,如果稍微修改一下,比如添加一个零,它会突然将执行时间从 ~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);
}
4

1 回答 1

11

i在两个循环中使用相同的循环变量 , 。这意味着在最内层循环完成其迭代后,i等于 300000,因此最外层循环在其一次迭代后中断。但是,如果您增加最外层循环的限制,最内层循环将再次运行,重新启动i并再次将其保持在 300000。改为在最外层循环中使用for (int j = 0; j < 200000; ++j)

于 2013-05-29T22:06:27.087 回答