// C Standard Library
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
// fmpi
#include <fmpi.h>
// Internal
#include "as.h"

#define T int64_t

FMPI_TASK_FUTHARK(array_sum, 1)

int main(int argc, char * argv[])
{
    struct fmpi_ctx * ctx = fmpi_init(&argc, &argv);
    if(ctx == NULL) {
        fprintf(stderr, "fmpi_init() failed!\n");
        return EXIT_FAILURE;
    }
    T in[] = {
        1,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,1,
        2,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,2,
        3,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,3,
        4,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,4
    };
    const size_t in_size = sizeof(in)/sizeof(T);
    T out = -1;
    struct fmpi_task array_sum_task = FMPI_REGISTER_SYNC_TASK(
        ctx, array_sum, fmpi_no_stencil(),
        fmpi_data_out(ctx, &out),
        fmpi_data_1d_in(ctx, in, in_size)
    );
    fmpi_task_run_sync(ctx, &array_sum_task);
    printf("rank=%d sum=%ld\n", fmpi_world_rank(ctx), out);
    fmpi_exit(&ctx);
    return EXIT_SUCCESS;
}