Расшифровка задания по измерению пропускной способности кеша 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
байт.
- Мое понимание измерения пропускной способности состоит в том, что я должен просто умножить размер массива на количество итераций и затем разделить на затраченное время. Могу ли я получить подтверждение того, что это правильно?
Полагаю, что так.