#include <getopt.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "utils.h"
#include <minos.h>
int fact_seq_native(uint64_t n, uint64_t *out) {
uint64_t f = 1;
uint64_t c;
for (c = 1; c <= n; c++)
f = f * c;
*out = f;
return 0;
}
int fact_seq(void *in, size_t isize, void **out, size_t *osize) {
uint64_t n = (uint64_t)in;
uint64_t f = 1;
uint64_t c;
for (c = 1; c <= n; c++)
f = f * c;
*out = (void *)f;
*osize = sizeof(uint64_t);
return 0;
}
int main(int argc, char **argv) {
uint64_t i;
mcl_handle **hdls;
struct timespec start, end;
uint64_t *in, *out, *out_test;
int ret = 0;
uint64_t pes[MCL_DEV_DIMS] = {1, 1, 1};
unsigned int errs, submitted;
char src_path[1024];
strcpy(src_path, XSTR(_MCL_TEST_PATH));
strcat(src_path, "/exec.cl");
mcl_banner("EXEC Request Test");
parse_global_opts(argc, argv);
hdls = (mcl_handle **)malloc(rep * sizeof(mcl_handle *));
in = (uint64_t *)malloc(rep * sizeof(uint64_t));
out = (uint64_t *)malloc(rep * sizeof(uint64_t));
out_test = (uint64_t *)malloc(rep * sizeof(uint64_t));
if (!in || !out || !out_test) {
printf("Error allocating memory. Aborting.\n");
goto err;
}
mcl_init(workers, 0x0);
for (i = 0; i < rep; i++)
in[i] = (rand() % BASE) + 1;
printf("Native Test...");
clock_gettime(CLOCK_MONOTONIC, &start);
for (i = 0; i < rep; i++) {
fact_seq_native(in[i], &out_test[i]);
}
clock_gettime(CLOCK_MONOTONIC, &end);
printf("Done.\n Test time: %f seconds\n", ((float)tdiff(end, start)) / BILLION);
#ifdef VERBOSE
for (i = 0; i < rep; i++)
printf(" %" PRIu64 " Factorial of %" PRIu64 " = %" PRIu64 "\n", i, in[i],
out_test[i]);
#endif
printf("Synchronous Test...");
clock_gettime(CLOCK_MONOTONIC, &start);
if (mcl_prg_load(src_path, "", MCL_PRG_SRC)) {
printf("Error loading program.\n");
goto err;
}
for (i = 0, errs = 0, submitted = 0; i < rep; i++) {
hdls[i] = mcl_task_create();
if (!hdls[i]) {
printf("Error creating task %" PRIu64 ".\n", i);
goto err;
}
if (mcl_task_set_kernel(hdls[i], "FACT", 2)) {
printf("Error setting task kernel %s for request %" PRIu64 ".\n", "FACT", i);
goto err;
}
if (mcl_task_set_arg(hdls[i], 0, (void *)&(in[i]), sizeof(uint64_t),
MCL_ARG_INPUT | MCL_ARG_SCALAR)) {
printf("Error setting argument for task %" PRIu64 ".\n", i);
goto err;
}
if (mcl_task_set_arg(hdls[i], 1, (void *)&(out[i]), sizeof(uint64_t),
MCL_ARG_OUTPUT | MCL_ARG_BUFFER)) {
printf("Error setting output for task %" PRIu64 ".\n", i);
goto err;
}
if (mcl_exec(hdls[i], pes, NULL, MCL_TASK_ANY)) {
printf("Error executing task %" PRIu64 ".", i);
goto err;
}
submitted++;
if (mcl_wait(hdls[i]))
printf("Request %" PRIu64 " timed out!", i);
}
clock_gettime(CLOCK_MONOTONIC, &end);
for (i = 0; i < rep; i++)
if (hdls[i]->status != MCL_REQ_COMPLETED || out_test[i] != out[i]) {
printf("Request %" PRIu64 " ref value=%" PRIu64 " comp value=%" PRIu64
" status=%" PRIx64 " retrun=%x" PRIx64 "\n",
i, out_test[i], out[i], hdls[i]->status, hdls[i]->ret);
ret = 1;
errs++;
}
if (!errs)
printf("Done.\n Test time: %f seconds\n", ((float)tdiff(end, start)) / BILLION);
else
printf("Detected %u errors!\n", errs);
for (i = 0; i < rep; i++)
mcl_hdl_free(hdls[i]);
printf("Asynchronous Test...");
clock_gettime(CLOCK_MONOTONIC, &start);
for (i = 0, errs = 0, submitted = 0; i < rep; i++) {
hdls[i] = mcl_task_create();
if (!hdls[i]) {
printf("Error creating task%" PRIu64 ".", i);
goto err;
}
if (mcl_task_set_kernel(hdls[i], "FACT", 2)) {
printf("Error setting task kernel %s for request %" PRIu64 ".\n", "FACT", i);
goto err;
}
if (mcl_task_set_arg(hdls[i], 0, (void *)&(in[i]), sizeof(uint64_t),
MCL_ARG_INPUT | MCL_ARG_SCALAR)) {
printf("Error setting argument for task %" PRIu64 ".\n", i);
goto err;
}
if (mcl_task_set_arg(hdls[i], 1, (void *)&(out[i]), sizeof(uint64_t),
MCL_ARG_OUTPUT | MCL_ARG_BUFFER)) {
printf("Error setting output for task %" PRIu64 ".\n", i);
goto err;
}
if (mcl_exec(hdls[i], pes, NULL, MCL_TASK_ANY)) {
printf("Error executing task %" PRIu64 ".", i);
goto err;
}
submitted++;
}
if (submitted == rep)
mcl_wait_all();
else
printf("Not all requests have been successfully submitted! (%u/%" PRIu64 ")\n", submitted, rep);
clock_gettime(CLOCK_MONOTONIC, &end);
for (i = 0; i < rep; i++)
if (hdls[i]->status != MCL_REQ_COMPLETED || out_test[i] != out[i]) {
printf("Request %" PRIu64 " ref value=%" PRIu64 " comp value=%" PRIu64
" status=%" PRIx64 " retrun=%x" PRIx64 "\n",
i, out_test[i], out[i], hdls[i]->status, hdls[i]->ret);
ret = 1;
errs++;
}
if (!errs)
printf("Done.\n Test time: %f seconds\n", ((float)tdiff(end, start)) / BILLION);
else
printf("Detected %u errors!\n", errs);
for (i = 0; i < rep; i++)
mcl_hdl_free(hdls[i]);
mcl_finit();
mcl_verify(ret);
free(out);
free(in);
free(hdls);
return 0;
err:
exit(EXIT_FAILURE);
}