Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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