/* GCC-StarPU Copyright (C) 2012 Institut National de Recherche en Informatique et Automatique GCC-StarPU is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GCC-StarPU is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC-StarPU. If not, see . */ #undef NDEBUG #include #include static void test_vec (void) { data_register_calls = data_unregister_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = sizeof (float); float vec[123] /* FIXME: warning: "considered unsafe" */ __attribute__ ((registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == vec); expected_unregister_arguments.pointer = vec; } static void test_matrix (void) { data_register_calls = data_unregister_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * sizeof (double); double matrix[123][234] /* FIXME: warning "considered unsafe" */ __attribute__ ((registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); expected_unregister_arguments.pointer = matrix; } static void test_with_heap_alloc (void) { data_register_calls = data_unregister_calls = 0; malloc_calls = free_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * 77 * sizeof (int); expected_malloc_argument = expected_register_arguments.elements * expected_register_arguments.element_size; int matrix[123][234][77] __attribute__ ((registered, heap_allocated)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); assert (malloc_calls == 1); expected_unregister_arguments.pointer = matrix; expected_free_argument = matrix; } /* Same as above, but with the attributes in reverse order. */ static void test_with_heap_alloc_reversed (void) { data_register_calls = data_unregister_calls = 0; malloc_calls = free_calls = 0; expected_register_arguments.pointer = NULL; expected_register_arguments.elements = 123; expected_register_arguments.element_size = 234 * 77 * sizeof (int); expected_malloc_argument = expected_register_arguments.elements * expected_register_arguments.element_size; int matrix[123][234][77] __attribute__ ((heap_allocated, registered)); assert (data_register_calls == 1); assert (expected_register_arguments.pointer == matrix); assert (malloc_calls == 1); expected_unregister_arguments.pointer = matrix; expected_free_argument = matrix; } int main (int argc, char *argv[]) { #pragma starpu initialize test_vec (); assert (data_unregister_calls == 1); test_matrix (); assert (data_unregister_calls == 1); test_with_heap_alloc (); assert (data_unregister_calls == 1); assert (free_calls == 1); test_with_heap_alloc_reversed (); assert (data_unregister_calls == 1); assert (free_calls == 1); return EXIT_SUCCESS; }