• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <pthread.h>
5 
6 static struct thread_data {
7 	unsigned long mib;
8 } td;
9 
worker(void * data)10 static void *worker(void *data)
11 {
12 	struct thread_data *td = data;
13 	unsigned long index;
14 	size_t size;
15 	char *buf;
16 	int i, first = 1;
17 
18 	size = td->mib * 1024UL * 1024UL;
19 	buf = malloc(size);
20 
21 	for (i = 0; i < 100000; i++) {
22 		for (index = 0; index + 4096 < size; index += 4096)
23 			memset(&buf[index+512], 0x89, 512);
24 		if (first) {
25 			printf("loop%d: did %lu MiB\n", i+1, size/(1024UL*1024UL));
26 			first = 0;
27 		}
28 	}
29 	return NULL;
30 }
31 
main(int argc,char * argv[])32 int main(int argc, char *argv[])
33 {
34 	unsigned long mib, threads;
35 	pthread_t *pthreads;
36 	int i;
37 
38 	if (argc < 3) {
39 		printf("%s: <MiB per thread> <threads>\n", argv[0]);
40 		return 1;
41 	}
42 
43 	mib = strtoul(argv[1], NULL, 10);
44 	threads = strtoul(argv[2], NULL, 10);
45 
46 	pthreads = calloc(threads, sizeof(pthread_t));
47 	td.mib = mib;
48 
49 	for (i = 0; i < threads; i++)
50 		pthread_create(&pthreads[i], NULL, worker, &td);
51 
52 	for (i = 0; i < threads; i++) {
53 		void *ret;
54 
55 		pthread_join(pthreads[i], &ret);
56 	}
57 	return 0;
58 }
59