Skip to content
Snippets Groups Projects
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 %}
}