Esempio n. 1
0
void stop_trace(int locations, int flag) {
    int tape_stats[statSize];
    int i,sizer;

    int loc_ptr;
    /* int op_cnt,loc_cnt,val_cnt,access_ptr; */

    loc_ptr = locations;
    put_op(end_of_tape);        /* Mark end of tape. */

    tape_stats[0] = ind_ptr;
    tape_stats[1] = dep_ptr;
    tape_stats[2] = loc_ptr;
    tape_stats[3] = vs_ptr;
    tape_stats[4] = BUFSIZE;
    close_tape(tape_stats,flag); /** closes the tape, files up stats, and
                                       writes the tape stats to the integer
                                       tape. **/

    sizer = sizeof(revreal)*(vs_ptr);
    if (revalso)
        taylor_close(sizer/(1+sizer/TBUFSIZE),dep_ptr,ind_ptr);
    for (i=0; i<statSize; i++)
        stats[tag][i]=tape_stats[i];
}
Esempio n. 2
0
void start_trace( short tnum, int revals ) {
    int kk;
    double** dum = 0;
    int degree = 0;

    revalso = revals;
    tag     = tnum;

    /* Set buffer size to be the default in usrparms.h */
    set_buf_size(BUFSIZE);

    get_fstr(op_file_name,tag,FNAME);
    get_fstr(int_file_name,tag,FNAME1);
    get_fstr(val_file_name,tag,FNAME2);
    get_fstr(vs_file_name,tag,FNAME3);

    init_stat_space(tag);

    /* Return old memory ... if used */
    if(op_tape[tag])  free((char*)op_tape[tag]);
    if(int_tape[tag]) free((char*)int_tape[tag]);
    if(val_tape[tag]) free((char*)val_tape[tag]);
    if(stats[tag])    free((char*)stats[tag]);

    op_tape[tag]  = (unsigned char *)malloc(BUFSIZE*sizeof(unsigned char));
    int_tape[tag] = (locint *)malloc(BUFSIZE*sizeof(locint));
    val_tape[tag] = (double *)malloc(BUFSIZE*sizeof(double));
    stats[tag]    = (int*)malloc(statSize*sizeof(int));
    if ((op_tape[tag]  == NULL) ||
            (int_tape[tag] == NULL) ||
            (val_tape[tag] == NULL) ||
            (stats[tag]    == NULL)) {
        fprintf(DIAG_OUT,"ADOL-C error: cannot allocate tape buffers!\n");
        exit (-1);
    }

    ind_ptr   = 0;
    dep_ptr   = 0;
    vs_ptr = 0;

    /* Initialize Tapes */
    set_buffers(op_file_name,op_tape[tag],
                int_file_name,int_tape[tag],
                val_file_name,val_tape[tag]);

    /* Put operation denoting the start_of_the tape */
    put_op(start_of_tape);
    /* Leave space for the stats */
    /* olvo 980914 unique size of stats block */
    for (kk=0; kk<sizeof(int)/sizeof(locint)*statSpace; kk++)
        put_locint(0);

    if (revalso)
        taylor_begin(tag,TBUFSIZE,dum,degree);
}
Esempio n. 3
0
int call_ext_fct(ext_diff_fct *edfct,
                 int n, double *xp, adouble *xa,
                 int m, double *yp, adouble *ya)
{
    int i = 0, ret;
    locint firstVal, numVals;
    double *vals;
    ADOLC_OPENMP_THREAD_NUMBER;
    ADOLC_OPENMP_GET_THREAD_NUMBER;

    if (edfct==NULL) fail(ADOLC_EXT_DIFF_NULLPOINTER_STRUCT);

    if (ADOLC_CURRENT_TAPE_INFOS.traceFlag) {
        put_op(ext_diff);
        ADOLC_PUT_LOCINT(edfct->index);
        ADOLC_PUT_LOCINT(n);
        ADOLC_PUT_LOCINT(m);
        ADOLC_PUT_LOCINT(xa[i].loc());
        ADOLC_PUT_LOCINT(ya[i].loc());
        ADOLC_PUT_LOCINT(0);               /* keep space for checkpointing index */

        oldTraceFlag=ADOLC_CURRENT_TAPE_INFOS.traceFlag;
        ADOLC_CURRENT_TAPE_INFOS.traceFlag=0;
    } else oldTraceFlag=0;

#if defined(ADOLC_SAFE_EXTERN)
    firstVal = 0;
#else
    updateLocs();
    firstVal = ADOLC_GLOBAL_TAPE_VARS.locMinUnused;
#endif
    numVals = ADOLC_GLOBAL_TAPE_VARS.numMaxAlive - firstVal;
    vals = new double[numVals];
    memcpy(vals, ADOLC_GLOBAL_TAPE_VARS.store + firstVal,
            numVals * sizeof(double));

    for (i=0; i<n; ++i) xp[i]=xa[i].getValue();
    for (i=0; i<m; ++i) yp[i]=ya[i].getValue();

    ret=edfct->function(n, xp, m, yp);

    memcpy(ADOLC_GLOBAL_TAPE_VARS.store + firstVal, vals,
            numVals * sizeof(double));
    delete[] vals;

    /* update taylor buffer if keep != 0 ; possible double counting as in
     * adouble.cpp => correction in taping.c */

    if (oldTraceFlag != 0) {
        ADOLC_CURRENT_TAPE_INFOS.numTays_Tape += n;
        ADOLC_CURRENT_TAPE_INFOS.numTays_Tape += m;
        if (ADOLC_CURRENT_TAPE_INFOS.keepTaylors) {
            for (i=0; i<n; ++i) ADOLC_WRITE_SCAYLOR(xa[i].getValue());
            for (i=0; i<m; ++i) ADOLC_WRITE_SCAYLOR(ya[i].getValue());
        }
    }
    /* write back */
    for (i=0; i<n; ++i) xa[i].setValue(xp[i]);
    for (i=0; i<m; ++i) ya[i].setValue(yp[i]);

    ADOLC_CURRENT_TAPE_INFOS.traceFlag=oldTraceFlag;

    return ret;
}