1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <pthread.h>
5
6static struct thread_data {
7	unsigned long mib;
8} td;
9
10static 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
32int 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