|
@@ -1,7 +1,7 @@
|
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
|
*
|
|
|
* Copyright (C) 2010 Université de Bordeaux 1
|
|
|
- * Copyright (C) 2010 Centre National de la Recherche Scientifique
|
|
|
+ * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique
|
|
|
*
|
|
|
* StarPU is free software; you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
@@ -16,6 +16,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <starpu.h>
|
|
|
+#include "../common/helper.h"
|
|
|
|
|
|
#ifdef STARPU_USE_CUDA
|
|
|
#include <starpu_cuda.h>
|
|
@@ -79,7 +80,7 @@ static void redux_opencl_kernel(void *descr[], void *arg)
|
|
|
|
|
|
h_dst += h_src;
|
|
|
|
|
|
- clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL);
|
|
|
+ clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL);
|
|
|
}
|
|
|
|
|
|
static void neutral_opencl_kernel(void *descr[], void *arg)
|
|
@@ -90,7 +91,7 @@ static void neutral_opencl_kernel(void *descr[], void *arg)
|
|
|
cl_command_queue queue;
|
|
|
starpu_opencl_get_current_queue(&queue);
|
|
|
|
|
|
- clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL);
|
|
|
+ clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -149,7 +150,7 @@ static void increment_opencl_kernel(void *descr[], void *cl_arg __attribute__((u
|
|
|
|
|
|
clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL);
|
|
|
h_token++;
|
|
|
- clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL);
|
|
|
+ clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -191,7 +192,10 @@ static starpu_codelet increment_cl = {
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
- starpu_init(NULL);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = starpu_init(NULL);
|
|
|
+ STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
|
|
|
|
|
|
starpu_variable_data_register(&handle, 0, (uintptr_t)&var, sizeof(unsigned));
|
|
|
|
|
@@ -208,26 +212,35 @@ int main(int argc, char **argv)
|
|
|
for (t = 0; t < ntasks; t++)
|
|
|
{
|
|
|
struct starpu_task *task = starpu_task_create();
|
|
|
-
|
|
|
+
|
|
|
task->cl = &increment_cl;
|
|
|
-
|
|
|
+
|
|
|
task->buffers[0].mode = STARPU_REDUX;
|
|
|
task->buffers[0].handle = handle;
|
|
|
-
|
|
|
- int ret = starpu_task_submit(task);
|
|
|
- STARPU_ASSERT(!ret);
|
|
|
|
|
|
+ int ret = starpu_task_submit(task);
|
|
|
+ if (ret == -ENODEV) goto enodev;
|
|
|
+ STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
}
|
|
|
|
|
|
- starpu_data_acquire(handle, STARPU_R);
|
|
|
+ ret = starpu_data_acquire(handle, STARPU_R);
|
|
|
+ STARPU_CHECK_RETURN_VALUE(ret, "starpu_data_acquire");
|
|
|
STARPU_ASSERT(var == ntasks*(loop + 1));
|
|
|
starpu_data_release(handle);
|
|
|
}
|
|
|
|
|
|
starpu_data_unregister(handle);
|
|
|
STARPU_ASSERT(var == ntasks*nloops);
|
|
|
-
|
|
|
+
|
|
|
starpu_shutdown();
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+enodev:
|
|
|
+ starpu_data_unregister(handle);
|
|
|
+ fprintf(stderr, "WARNING: No one can execute this task\n");
|
|
|
+ /* yes, we do not perform the computation but we did detect that no one
|
|
|
+ * could perform the kernel, so this is not an error from StarPU */
|
|
|
+ starpu_shutdown();
|
|
|
+ return 77;
|
|
|
}
|