关于测量L2缓存吞吐量的解释

时间:2012-10-10 01:38:58

标签: c malloc parameter-passing cpu-cache

我注意到我的几个同学在过去几天实际上已尝试在StackOverflow上询问有关此相同作业的问题,因此我将无耻地复制粘贴(仅限)已删除的一个问题的上下文(但仍然缓存在谷歌没有答案)以节省时间。我提前为此道歉。

上下文
我正在尝试编写一个C程序来测量系统L2缓存的数据吞吐量(MBytes / sec)。要执行测量,我必须编写一个程序,将阵列A复制到阵列B,重复多次,并测量吞吐量。

至少考虑两种情况:

  • 两个字段都适合L2缓存
  • 数组大小明显大于L2缓存大小。

使用string.h中的memcpy()复制数组,用一些值初始化两个数组(例如使用rand()的随机数),并重复至少100次,否则你看不出差异。

数组大小和重复次数应为输入参数。其中一个数组大小应该是我的L2缓存大小的一半。

问题
因此,根据作业的背景,我很清楚我需要做什么,因为它几乎直接告诉我。问题是我们得到了一些模板代码可供使用,而且我无法破译部分代码。如果有人能帮助我弄清楚发生了什么,我真的很感激。

代码是:

/* do not add other includes */
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>

double getTime(){
  struct timeval t;
  double sec, msec;

  while (gettimeofday(&t, NULL) != 0);
  sec = t.tv_sec;
  msec = t.tv_usec;

  sec = sec + msec/1000000.0;

  return sec;
}

/* for task 1 only */
void usage(void)
{
    fprintf(stderr, "bandwith [--no_iterations iterations] [--array_size size]\n");
    exit(1);
}

int main (int argc, char *argv[])
{
  double t1, t2; 

  /* variables for task 1 */
  unsigned int size = 1024;
  unsigned int N = 100; 
  unsigned int i;

  /* declare variables; examples, adjust for task */
  int *A;
  int *B;


  /* parameter parsing task 1 */
  for(i=1; i<(unsigned)argc; i++) {
    if (strcmp(argv[i], "--no_iterations") == 0) {
      i++;
      if (i < argc)
        sscanf(argv[i], "%u", &N);
      else
        usage();
    } else if (strcmp(argv[i], "--array_size") == 0) {
      i++;
      if (i < argc)
        sscanf(argv[i], "%u", &size);
      else
        usage();
    } else usage();
  }


  /* allocate memory for arrays; examples, adjust for task */
  A = malloc (size*size * sizeof (int));
  B = malloc (size*size * sizeof (int));



  /* initialise arrray elements */    




  t1 = getTime();

  /* code to be measured goes here */



  t2 = getTime();


  /* output; examples, adjust for task */
  printf("time: %6.2f secs\n",t2 - t1);

  /* free memory; examples, adjust for task */
  free(B);
  free(A);

  return 0;  
}

我的问题是:

  • 使用方法的目的是什么?
  • 参数传递部分应该做什么,因为据我所知,它只会导致使用()并且不会使用sscanf行的任何参数?
  • 在这个赋值中,我们打算以KB或MB记录数组大小,我知道malloc以字节为单位分配大小,并且size变量值为1024将导致1MB * sizeof(int)(我认为至少)。在这种情况下,我应该记录的数组大小是1MB还是1MB * sizeof(int)?
  • 如果参数传递正常并且我们传递参数来更改size变量值,那么数组大小是否总是size变量的平方?或者数组大小是否只被视为size变量?对于malloc尺寸*大小而不仅仅是大小来说似乎非常不直观,除非我对这一切有所遗漏。
  • 我对测量吞吐量的理解是,我应该将数组大小乘以迭代次数,然后除以所花费的时间。我可以得到任何确认这是正确的吗?

这是我理解这项任务的唯一障碍。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

  • 使用方法的目的是什么?

用法函数告诉您应该在命令行上将哪些参数传递给程序。

  • 参数传递部分应该做什么,因为据我所知,它只会导致使用()并且不会使用sscanf行的任何参数?

当向程序传递无效参数时,它会调用usage()函数。

否则,它将迭代次数设置为变量N为参数no_iterations的值(默认值为100),并设置数组的大小到变量size到参数array_size的值(默认值为1024)。

  • 在这个赋值中,我们打算以KB或MB记录数组大小,我知道malloc以字节为单位分配大小,大小变量值为1024将导致1MB * sizeof(int)(我认为至少)。在这种情况下,我应该记录的数组大小是1MB还是1MB * sizeof(int)?

如果您的大小应该是1 MB,那么这可能就是大小。

如果您想确保大小是数据类型大小的一个因素,那么您可以这样做:

if (size % sizeof(int) != 0)
{
    size = ((int)(size / sizeof(int))) * sizeof(int);
}
  • 如果参数传递正常并且我们传递参数来改变大小变量值,那么数组大小总是大小变量的平方吗?或者数组大小是否只被视为大小变量?对于malloc尺寸*大小而不仅仅是大小来说似乎非常不直观,除非我对这一切有所遗漏。

您可能只想分配size个字节。除非你应该使用矩阵,而不仅仅是数组。在这种情况下,它将是size * size个字节。

  • 我对测量吞吐量的理解是,我应该将数组大小乘以迭代次数,然后除以所花费的时间。我可以得到任何确认这是正确的吗?

我想是的。