Skip to content
Snippets Groups Projects

Fix field size

Merged Markus Holzer requested to merge holzer/pystencils:FixFieldSize into master
+ 23
6
@@ -266,7 +266,6 @@ type_mapping = {
@@ -266,7 +266,6 @@ type_mapping = {
np.complex128: (('PyComplex_RealAsDouble', 'PyComplex_ImagAsDouble'), 'ComplexDouble'),
np.complex128: (('PyComplex_RealAsDouble', 'PyComplex_ImagAsDouble'), 'ComplexDouble'),
}
}
template_extract_scalar = """
template_extract_scalar = """
PyObject * obj_{name} = PyDict_GetItemString(kwargs, "{name}");
PyObject * obj_{name} = PyDict_GetItemString(kwargs, "{name}");
if( obj_{name} == NULL) {{ PyErr_SetString(PyExc_TypeError, "Keyword argument '{name}' missing"); return NULL; }};
if( obj_{name} == NULL) {{ PyErr_SetString(PyExc_TypeError, "Keyword argument '{name}' missing"); return NULL; }};
@@ -357,7 +356,7 @@ def equal_size_check(fields):
@@ -357,7 +356,7 @@ def equal_size_check(fields):
return template_size_check.format(cond=cond)
return template_size_check.format(cond=cond)
def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
def create_function_boilerplate_code(parameter_info, name, ast_node, insert_checks=True):
pre_call_code = ""
pre_call_code = ""
parameters = []
parameters = []
post_call_code = ""
post_call_code = ""
@@ -375,6 +374,19 @@ def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
@@ -375,6 +374,19 @@ def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
np_dtype = field.dtype.numpy_dtype
np_dtype = field.dtype.numpy_dtype
item_size = np_dtype.itemsize
item_size = np_dtype.itemsize
 
if ast_node.instruction_set:
 
byte_width = ast_node.instruction_set['width'] * item_size
 
offset = max(max(ast_node.ghost_layers)) * item_size
 
offset_cond = f"(((uintptr_t) buffer_{field.name}.buf) + {offset}) % {byte_width} == 0"
 
 
message = str(offset) + ". This is probably due to a different number of ghost_layers chosen for " \
 
"the arrays and the kernel creation. If the number of ghost layers for the " \
 
"kernel creation is not specified it will choose a suitable value " \
 
"automatically. This value might not " \
 
"be compatible with the allocated arrays."
 
pre_call_code += template_check_array.format(cond=offset_cond, what="offset", name=field.name,
 
expected=message)
 
if (np_dtype.isbuiltin and FieldType.is_generic(field)
if (np_dtype.isbuiltin and FieldType.is_generic(field)
and not np.issubdtype(field.dtype.numpy_dtype, np.complexfloating)):
and not np.issubdtype(field.dtype.numpy_dtype, np.complexfloating)):
dtype_cond = "buffer_{name}.format[0] == '{format}'".format(name=field.name,
dtype_cond = "buffer_{name}.format[0] == '{format}'".format(name=field.name,
@@ -418,7 +430,7 @@ def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
@@ -418,7 +430,7 @@ def create_function_boilerplate_code(parameter_info, name, insert_checks=True):
extract_function_imag=extract_function[1],
extract_function_imag=extract_function[1],
target_type=target_type,
target_type=target_type,
real_type="float" if target_type == "ComplexFloat"
real_type="float" if target_type == "ComplexFloat"
else "double",
else "double",
name=param.symbol.name)
name=param.symbol.name)
else:
else:
pre_call_code += template_extract_scalar.format(extract_function=extract_function,
pre_call_code += template_extract_scalar.format(extract_function=extract_function,
@@ -505,7 +517,7 @@ class ExtensionModuleCode:
@@ -505,7 +517,7 @@ class ExtensionModuleCode:
old_name = ast.function_name
old_name = ast.function_name
ast.function_name = "kernel_" + name
ast.function_name = "kernel_" + name
print(generate_c(ast, custom_backend=self._custom_backend), file=file)
print(generate_c(ast, custom_backend=self._custom_backend), file=file)
print(create_function_boilerplate_code(ast.get_parameters(), name), file=file)
print(create_function_boilerplate_code(ast.get_parameters(), name, ast), file=file)
ast.function_name = old_name
ast.function_name = old_name
print(create_module_boilerplate_code(self.module_name, self._function_names), file=file)
print(create_module_boilerplate_code(self.module_name, self._function_names), file=file)
@@ -564,8 +576,13 @@ def compile_module(code, code_hash, base_dir):
@@ -564,8 +576,13 @@ def compile_module(code, code_hash, base_dir):
def compile_and_load(ast, custom_backend=None):
def compile_and_load(ast, custom_backend=None):
cache_config = get_cache_config()
cache_config = get_cache_config()
code_hash_str = "mod_" + hashlib.sha256(generate_c(ast, dialect='c',
custom_backend=custom_backend).encode()).hexdigest()
generated_code = generate_c(ast, dialect='c', custom_backend=custom_backend)
 
fields_accessed = str(ast.fields_accessed)
 
 
# Also die Information of the field size should be contained in the hash string. Due to padding the generated code
 
# can look similar for different field sizes.
 
code_hash_str = "mod_" + hashlib.sha256((generated_code + fields_accessed).encode()).hexdigest()
code = ExtensionModuleCode(module_name=code_hash_str, custom_backend=custom_backend)
code = ExtensionModuleCode(module_name=code_hash_str, custom_backend=custom_backend)
code.add_function(ast, ast.function_name)
code.add_function(ast, ast.function_name)
Loading