Расшифровка задания по измерению пропускной способности кеша L2

Я заметил, что несколько моих одноклассников на самом деле пытались задать вопросы об этом же назначении в Stackru в течение последних нескольких дней, поэтому я собираюсь бесстыдно скопировать вставить (только) контекст одного вопроса, который был удален (но все еще кэширован) в Google без ответов), чтобы сэкономить время. Я заранее прошу прощения за это.

контекст
Я пытаюсь написать программу на C, которая измеряет пропускную способность (MBytes/sec) кэша L2 моей системы. Чтобы выполнить измерение, мне нужно написать программу, которая копирует массив A в массив B, повторяется несколько раз и измеряет пропускную способность.

Рассмотрим как минимум два сценария:

  • Оба поля помещаются в кэш L2
  • Размер массива значительно больше размера кэша L2.

Используя memcpy() из string.h для копирования массивов, инициализируйте оба массива с некоторыми значениями (например, случайными числами, используя 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;  
}

Мои вопросы:

  • Какова может быть цель использования метода?
  • Что должна делать часть передачи параметров, потому что, насколько я могу судить, она всегда будет приводить к использованию () и не будет принимать никаких параметров со строками sscanf?
  • В этом назначении мы должны записывать размеры массивов в килобайтах или мегабайтах, и я знаю, что malloc выделяет размер в байтах и ​​с size значение переменной 1024 приведет к 1 МБ * sizeof(int) (я думаю, по крайней мере). В этом случае размер массива, который я должен записать, составляет 1 МБ или 1 МБ * sizeof(int)?
  • Если передача параметров работала правильно, и мы передали параметры для изменения size значение переменной будет размер массива всегда будет size переменная в квадрате? Или размер массива будет считаться просто size переменная? Кажется, что очень маловероятно, чтобы размер * размера malloc, а не просто размер, если я что-то упускаю во всем этом.
  • Мое понимание измерения пропускной способности состоит в том, что я должен просто умножить размер массива на количество итераций и затем разделить на затраченное время. Могу ли я получить подтверждение того, что это правильно?

Это единственные препятствия в моем понимании этого задания. Любая помощь приветствуется.

1 ответ

Решение
  • Какова может быть цель использования метода?

Функция использования сообщает вам, какие аргументы должны быть переданы программе в командной строке.

  • Что должна делать часть передачи параметров, потому что, насколько я могу судить, она всегда будет приводить к использованию () и не будет принимать никаких параметров со строками sscanf?

Он приводит к вызову функции using (), когда в программу передается неверный аргумент.

В противном случае он устанавливает количество итераций для переменной N к значению аргумента no_iterations (значение по умолчанию 100), и он устанавливает размер массива переменной size к значению аргумента array_size (значение по умолчанию 1024).

  • В этом назначении мы должны записывать размеры массивов в килобайтах или мегабайтах, и я знаю, что malloc выделяет размер в байтах и ​​значение переменной размера 1024 приведет к 1 МБ * sizeof(int) (я думаю, по крайней мере). В этом случае размер массива, который я должен записать, составляет 1 МБ или 1 МБ * sizeof(int)?

Если предполагается, что ваш размер составляет 1 МБ, то это, вероятно, то, что размер должен быть.

Если вы хотите убедиться, что размер является фактором размера типа данных, то вы можете сделать:

if (size % sizeof(int) != 0)
{
    size = ((int)(size / sizeof(int))) * sizeof(int);
}
  • Если передача параметров работала правильно, и мы передали параметры для изменения значения переменной размера, будет ли размер массива всегда квадратом переменной размера? Или размер массива будет считаться просто переменной размера? Кажется, что очень маловероятно, чтобы размер * размера malloc, а не просто размер, если я что-то упускаю во всем этом.

Вы, вероятно, просто хотите выделить size байт. Если только вы не должны работать с матрицами, а не только с массивами. В этом случае это будет size * size байт.

  • Мое понимание измерения пропускной способности состоит в том, что я должен просто умножить размер массива на количество итераций и затем разделить на затраченное время. Могу ли я получить подтверждение того, что это правильно?

Полагаю, что так.

Другие вопросы по тегам