def cli_mat_mat(mat_shape, optimize, **kwargs): """``AB = C``.""" i, j, k = dimensions('i j k') A = Function(name='A', shape=mat_shape, dimensions=(i, j)) B = Function(name='B', shape=mat_shape, dimensions=(j, k)) C = Function(name='C', shape=mat_shape, dimensions=(i, k)) mat_mat(A, B, C, optimize)
def cli_transpose_mat_vec(mat_shape, vec_shape, optimize, **kwargs): """``A -> A^T, A^Tx = b``.""" i, j = dimensions('i j') A = Function(name='A', shape=mat_shape, dimensions=(i, j)) x = Function(name='x', shape=vec_shape, dimensions=(j,)) b = Function(name='b', shape=vec_shape, dimensions=(i,)) transpose_mat_vec(A, x, b, optimize)
def default_dim_allocator(count): global dim_index names = '' for i in range(count): names += 'd' + str(dim_index) + ' ' dim_index += 1 names = names[:-1] return dimensions(names)
def cli_chain_contractions(mat_shape, optimize, **kwargs): """``AB + AC = D, DE = F``.""" i, j, k, l = dimensions('i j k l') A = Function(name='A', shape=mat_shape, dimensions=(i, j)) B = Function(name='B', shape=mat_shape, dimensions=(j, k)) C = Function(name='C', shape=mat_shape, dimensions=(j, k)) D = Function(name='D', shape=mat_shape, dimensions=(i, k)) E = Function(name='E', shape=mat_shape, dimensions=(k, l)) F = Function(name='F', shape=mat_shape, dimensions=(i, l)) chain_contractions(A, B, C, D, E, F, optimize)
def test_edge_cases(self, exprs, simd_level, expected): # Tests for issue #1695 t, x, y = dimensions('t x y') g = TimeFunction(name='g', shape=(1, 3), dimensions=(t, x), time_order=0, dtype=np.int32) g.data[0, :] = [0, 1, 2] h1 = TimeFunction(name='h1', shape=(1, 3), dimensions=(t, y), time_order=0) h1.data[0, :] = 0 # List comprehension would need explicit locals/globals mappings to eval for i, e in enumerate(list(exprs)): exprs[i] = eval(e) op = Operator(exprs, opt=('advanced', {'openmp': True})) iterations = FindNodes(Iteration).visit(op) try: assert 'omp for collapse' in iterations[0].pragmas[0].value if simd_level: assert 'omp simd' in iterations[simd_level].pragmas[0].value except: # E.g. gcc-5 doesn't support array reductions, so the compiler will # generate different legal code assert not Ompizer._support_array_reduction( configuration['compiler']) assert any('omp for collapse' in i.pragmas[0].value for i in iterations if i.pragmas) op.apply() assert (h1.data == expected).all()