def write_M_add_func(myfile, coeffs, index, mat_name): nonzero_coeffs = [coeff for coeff in coeffs if is_nonzero(coeff)] nnz = len(nonzero_coeffs) add = 'void %s_Add%d( int m, int n, ' % (mat_name, index) add += ', '.join(['double* %s%d' % (mat_name, i) for i in range(nnz)]) add += ', int ld%s, double* R, int ldR, int bl_ic_nt ' % (mat_name) # Handle the C := alpha A * B + beta C is_output = (mat_name == 'M') #is_output = False #if is_output: # add += ', double beta' add += ') {' write_line(myfile, 0, add) # Handle the C := alpha A * B + beta C write_line(myfile, 1, 'int i, j;') #write_line( myfile, 1, '#pragma omp parallel for schedule( dynamic )' ) write_line(myfile, 0, '#ifdef _PARALLEL_') write_line(myfile, 1, '#pragma omp parallel for num_threads( bl_ic_nt )') write_line(myfile, 0, '#endif') write_line(myfile, 1, 'for ( j = 0; j < n; ++j ) {') write_line(myfile, 2, 'for ( i = 0; i < m; ++i ) {') for j, coeff in enumerate(nonzero_coeffs): ind = j add = data_access(mat_name, str(ind)) + ' += ' add += arith_expression(coeff, 'R', '') add += ';' write_line(myfile, 3, add) write_line(myfile, 2, '}') write_line(myfile, 1, '}') write_line(myfile, 0, '}') # end of function
def arith_expression(coeff, mat_name, ind): ''' Return the arithmetic expression needed for multiplying coeff by value in a string of expressions. ''' value = data_access(mat_name, str(ind)) if is_one(coeff): expr = ' %s' % value elif is_negone(coeff): expr = ' - %s' % value else: #print "coeff is not +-1!" expr = ' (double)(%s) * %s' % (coeff, value) if ind != 0 and not is_negone(coeff): return ' +' + expr return expr
def write_add_func(myfile, coeffs, index, mat_name): ''' Write the add function for a set of coefficients. This is a custom add function used for a single multiply in a single fast algorithm. coeffs is the set of coefficients used for the add ''' nonzero_coeffs = [coeff for coeff in coeffs if is_nonzero(coeff)] nnz = len(nonzero_coeffs) add = 'void %s_Add%d( int m, int n, ' % (mat_name, index) add += ', '.join(['double* %s%d' % (mat_name, i) for i in range(nnz)]) add += ', int ld%s, double* R, int ldR, int bl_ic_nt ' % (mat_name) # Handle the C := alpha A * B + beta C is_output = (mat_name == 'M') #is_output = False #if is_output: # add += ', double beta' add += ') {' write_line(myfile, 0, add) # Handle the C := alpha A * B + beta C if is_output: #write_line( myfile, 1, 'int i, j;' ) #write_line( myfile, 1, 'for ( j = 0; j < n; ++j ) {') #write_line( myfile, 2, 'for ( i = 0; i < m; ++i ) {') #add = data_access('R') + ' =' #for j, coeff in enumerate(nonzero_coeffs): # ind = j # add += arith_expression(coeff, mat_name, ind ) #add += ' + %s;' % (data_access('R')) #write_line(myfile, 3, add) #write_line(myfile, 2, '}') #write_line(myfile, 1, '}') write_line(myfile, 1, 'int i, j;') #write_line( myfile, 1, '#pragma omp parallel for schedule( dynamic )' ) write_line(myfile, 0, '#ifdef _PARALLEL_') write_line(myfile, 1, '#pragma omp parallel for num_threads( bl_ic_nt )') write_line(myfile, 0, '#endif') write_line(myfile, 1, 'for ( j = 0; j < n; ++j ) {') write_line(myfile, 2, 'for ( i = 0; i < m; ++i ) {') for j, coeff in enumerate(nonzero_coeffs): ind = j add = data_access(mat_name, str(ind)) + ' += ' add += arith_expression(coeff, 'R', '') add += ';' write_line(myfile, 3, add) write_line(myfile, 2, '}') write_line(myfile, 1, '}') #write_line( myfile, 1, 'int i, j;' ) #for j, coeff in enumerate(nonzero_coeffs): # write_line( myfile, 1, 'for ( j = 0; j < n; ++j ) {') # write_line( myfile, 2, 'for ( i = 0; i < m; ++i ) {') # ind = j # add = data_access( mat_name, str(ind) ) + ' += ' # add += arith_expression(coeff, 'R', '' ) # add += ';' # write_line(myfile, 3, add) # write_line(myfile, 2, '}') # write_line(myfile, 1, '}') else: write_line(myfile, 1, 'int i, j;') write_line(myfile, 0, '#ifdef _PARALLEL_') write_line(myfile, 1, '#pragma omp parallel for num_threads( bl_ic_nt )') write_line(myfile, 0, '#endif') write_line(myfile, 1, 'for ( j = 0; j < n; ++j ) {') write_line(myfile, 2, 'for ( i = 0; i < m; ++i ) {') add = data_access('R') + ' =' for j, coeff in enumerate(nonzero_coeffs): ind = j add += arith_expression(coeff, mat_name, ind) add += ';' write_line(myfile, 3, add) write_line(myfile, 2, '}') write_line(myfile, 1, '}') write_line(myfile, 0, '}') # end of function