def test_symtab_implementation_for_opencl(): ''' Tests that the GOcean specialised Symbol Table implements the abstract properties needed to generate OpenCL. ''' kschedule = GOKernelSchedule('test') # Test symbol table without any kernel argument with pytest.raises(GenerationError) as err: _ = kschedule.symbol_table.iteration_indices assert ("GOcean 1.0 API kernels should always have at least two " "arguments representing the iteration indices but the Symbol " "Table for kernel 'test' has only 0 argument(s).") in str(err) # Test symbol table with 1 kernel argument arg1 = Symbol("arg1", "integer", [], interface=Symbol.Argument(access=Symbol.Access.READ)) kschedule.symbol_table.add(arg1) kschedule.symbol_table.specify_argument_list([arg1]) with pytest.raises(GenerationError) as err: _ = kschedule.symbol_table.iteration_indices assert ("GOcean 1.0 API kernels should always have at least two " "arguments representing the iteration indices but the Symbol " "Table for kernel 'test' has only 1 argument(s).") in str(err) # Test symbol table with 2 kernel argument arg2 = Symbol("arg2", "integer", shape=[], interface=Symbol.Argument(access=Symbol.Access.READ)) kschedule.symbol_table.add(arg2) kschedule.symbol_table.specify_argument_list([arg1, arg2]) iteration_indices = kschedule.symbol_table.iteration_indices assert iteration_indices[0] is arg1 assert iteration_indices[1] is arg2 # Test symbol table with 3 kernel argument arg3 = Symbol("buffer1", "real", shape=[10, 10], interface=Symbol.Argument(access=Symbol.Access.READ)) kschedule.symbol_table.add(arg3) kschedule.symbol_table.specify_argument_list([arg1, arg2, arg3]) iteration_indices = kschedule.symbol_table.iteration_indices data_args = kschedule.symbol_table.data_arguments assert iteration_indices[0] is arg1 assert iteration_indices[1] is arg2 assert data_args[0] is arg3 # Test gen_ocl with wrong iteration indices types and shapes. arg1._datatype = "real" with pytest.raises(GenerationError) as err: _ = kschedule.symbol_table.iteration_indices assert ("GOcean 1.0 API kernels first argument should be a scalar integer" " but got a scalar of type 'real' for kernel 'test'.")\ in str(err) arg1._datatype = "integer" # restore arg2._shape = [None] with pytest.raises(GenerationError) as err: _ = kschedule.symbol_table.iteration_indices assert ("GOcean 1.0 API kernels second argument should be a scalar integer" " but got an array of type 'integer' for kernel 'test'.")\ in str(err)
def test_cw_gen_declaration(): '''Check the CWriter class gen_declaration method produces the expected declarations. ''' cwriter = CWriter() # Basic entries symbol = Symbol("dummy1", "integer") result = cwriter.gen_declaration(symbol) assert result == "int dummy1" symbol = Symbol("dummy1", "character") result = cwriter.gen_declaration(symbol) assert result == "char dummy1" symbol = Symbol("dummy1", "boolean") result = cwriter.gen_declaration(symbol) assert result == "bool dummy1" # Array argument symbol = Symbol("dummy2", "real", shape=[2, None, 2], interface=Symbol.Argument(access=Symbol.Access.READ)) result = cwriter.gen_declaration(symbol) assert result == "double * restrict dummy2" # Array with unknown intent symbol = Symbol("dummy2", "integer", shape=[2, None, 2], interface=Symbol.Argument(access=Symbol.Access.UNKNOWN)) result = cwriter.gen_declaration(symbol) assert result == "int * restrict dummy2" # Check invalid datatype produces and error symbol._datatype = "invalid" with pytest.raises(NotImplementedError) as error: _ = cwriter.gen_declaration(symbol) assert "Could not generate the C definition for the variable 'dummy2', " \ "type 'invalid' is currently not supported." in str(error)