【问题标题】:Decipher assignment about measuring throughput of L2 cache测算L2缓存吞吐量的破译作业
【发布时间】:2012-10-10 01:38:58
【问题描述】:

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

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

至少考虑两种情况:

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

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

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

问题
因此,基于作业的背景,我很清楚我需要做什么,因为它几乎直截了当地告诉了我。问题是我们得到了一些模板代码来使用,而我在破译其中的一部分时遇到了麻烦。如果有人能帮助我弄清楚发生了什么,我将不胜感激。

代码是:

/* 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;  
}

我的问题是:

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

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

【问题讨论】:

    标签: c malloc parameter-passing cpu-cache


    【解决方案1】:
    • 使用方法的目的是什么?

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

    • 参数传递部分应该做什么,因为据我所知,它总是会导致 usage() 并且不会在 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 似乎非常不直观,除非我对这一切都遗漏了一些东西。

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

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

    我想是的。

    【讨论】:

    • 感谢您的回答。但是通过参数传递我将如何传递no_iterationsarray_size?在当前代码中,如果我尝试将数字放入这些参数中,它只会导致 usage()。获得usage() 以外的其他内容的唯一方法是将--no_iteration 和/或--array_size 作为字符串作为参数放入,或者在当前代码中根本不传递任何参数,这似乎不正确。
    • 例如,如果程序名为“cachetest”,那么您可以输入:./cachetest --no_iterations 50 --array_size 2056
    • 您输入--no_iterationsarray_size 作为字符串是正确的。正如我在之前的评论中输入的那样,每个数字后面都有数值。
    • 非常感谢。愚蠢的我没有注意到 i++ 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2018-06-02
    • 2020-12-28
    • 2015-10-25
    相关资源
    最近更新 更多