main.c 3.09 KiB
#include <assert.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "timing.h"
{% if likwid %}
#include <likwid-marker.h>
{% endif %}
//kernels
{% for include in includes %}
#include "{{ include }}.h"
{% endfor %}
#define RESTRICT __restrict__
#define FUNC_PREFIX
int main(int argc, char **argv)
{
if(argc < 2) {
printf("Usage: %s <n_repeat>\n", argv[0]);
return -1;
}
int n_repeat = atoi(argv[1]);
{% if likwid %}
LIKWID_MARKER_INIT;
{%- endif %}
{% for kernel in kernels %}
{ // Kernel: {{kernel.name}}
{% for field_name, dataType, elements, size, offset, alignment in kernel.fields %}
// Initialization {{field_name}}
{% if alignment > 0 %}
{{dataType}}* {{field_name}} = ({{dataType}} *) aligned_alloc({{alignment}}, {{size}});//, {{offset}});
{% else %}
{{dataType}}* {{field_name}} = ({{dataType}} *) malloc({{size}});
{% endif %}
{% if kernel.openmp %}
#pragma omp parallel for schedule(static)
{% endif %}
for (unsigned long long i = 0; i < {{elements}}; ++i)
{{field_name}}[i] = 0.23;
{% endfor %}
{% for constantName, dataType in kernel.constants %}
// Constant {{constantName}}
{{dataType}} {{constantName}};
{{constantName}} = 0.23;
{% endfor %}
{% if likwid %}
{% if kernel.openmp %}
#pragma omp parallel
{
{% endif %}
LIKWID_MARKER_REGISTER("{{kernel.name}}");
{% if kernel.openmp %}
}
{% endif %}
{% endif %}
for(int warmup = 1; warmup >= 0; --warmup) {
int repeat = 2;
if(warmup == 0) {
repeat = n_repeat;
{% if likwid %}
{% if kernel.openmp %}
#pragma omp parallel
{
{% endif %}
LIKWID_MARKER_START("{{kernel.name}}");
{% if kernel.openmp %}
}
{% endif %}
{% endif %}
}
{% if timing %}
double wcStartTime, cpuStartTime, wcEndTime, cpuEndTime;
timing(&wcStartTime, &cpuStartTime);
{% endif %}
for (; repeat > 0; --repeat)
{
{{kernel.name}}({{kernel.call_argument_list}});
}
{% if timing %}
timing(&wcEndTime, &cpuEndTime);
if( warmup == 0)
printf("%s\t%e\n", "{{kernel.name}}",(wcEndTime - wcStartTime) / n_repeat );
{% endif %}
}
{% if likwid %}
{% if kernel.openmp %}
#pragma omp parallel
{
{% endif %}
LIKWID_MARKER_STOP("{{kernel.name}}");
{% if kernel.openmp %}
}
{% endif %}
{% endif %}
{% for field_name, dataType, elements, size, offset, alignment in kernel.fields %}
free({{field_name}});
{% endfor %}
}
{% endfor %}
{% if likwid %}
LIKWID_MARKER_CLOSE;
{% endif %}
}