58 lines
1 KiB
C
58 lines
1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <pthread.h>
|
|
|
|
static struct thread_data {
|
|
unsigned long mib;
|
|
} td;
|
|
|
|
static void *worker(void *data)
|
|
{
|
|
struct thread_data *td = data;
|
|
unsigned long index;
|
|
size_t size;
|
|
char *buf;
|
|
int i, first = 1;
|
|
|
|
size = td->mib * 1024UL * 1024UL;
|
|
buf = malloc(size);
|
|
|
|
for (i = 0; i < 100000; i++) {
|
|
for (index = 0; index + 4096 < size; index += 4096)
|
|
memset(&buf[index+512], 0x89, 512);
|
|
if (first) {
|
|
printf("loop%d: did %lu MiB\n", i+1, size/(1024UL*1024UL));
|
|
first = 0;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
unsigned long mib, threads;
|
|
pthread_t *pthreads;
|
|
int i;
|
|
|
|
if (argc < 3) {
|
|
printf("%s: <MiB per thread> <threads>\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
mib = strtoul(argv[1], NULL, 10);
|
|
threads = strtoul(argv[2], NULL, 10);
|
|
|
|
pthreads = calloc(threads, sizeof(pthread_t));
|
|
td.mib = mib;
|
|
|
|
for (i = 0; i < threads; i++)
|
|
pthread_create(&pthreads[i], NULL, worker, &td);
|
|
|
|
for (i = 0; i < threads; i++) {
|
|
void *ret;
|
|
|
|
pthread_join(pthreads[i], &ret);
|
|
}
|
|
return 0;
|
|
}
|