我注意到我的几个同学在过去几天实际上已尝试在StackOverflow上询问有关此相同作业的问题,因此我将无耻地复制粘贴(仅限)已删除的一个问题的上下文(但仍然缓存在谷歌没有答案)以节省时间。我提前为此道歉。
上下文
我正在尝试编写一个C程序来测量系统L2缓存的数据吞吐量(MBytes / sec)。要执行测量,我必须编写一个程序,将阵列A复制到阵列B,重复多次,并测量吞吐量。
至少考虑两种情况:
使用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;
}
我的问题是:
size
变量值为1024将导致1MB * sizeof(int)(我认为至少)。在这种情况下,我应该记录的数组大小是1MB还是1MB * sizeof(int)?size
变量值,那么数组大小是否总是size
变量的平方?或者数组大小是否只被视为size
变量?对于malloc尺寸*大小而不仅仅是大小来说似乎非常不直观,除非我对这一切有所遗漏。这是我理解这项任务的唯一障碍。任何帮助将不胜感激。
答案 0 :(得分:2)
用法函数告诉您应该在命令行上将哪些参数传递给程序。
当向程序传递无效参数时,它会调用usage()函数。
否则,它将迭代次数设置为变量N
为参数no_iterations
的值(默认值为100),并设置数组的大小到变量size
到参数array_size
的值(默认值为1024)。
如果您的大小应该是1 MB,那么这可能就是大小。
如果您想确保大小是数据类型大小的一个因素,那么您可以这样做:
if (size % sizeof(int) != 0)
{
size = ((int)(size / sizeof(int))) * sizeof(int);
}
您可能只想分配size
个字节。除非你应该使用矩阵,而不仅仅是数组。在这种情况下,它将是size * size
个字节。
我想是的。