So, this is a condensed version of the original problem. It looks like the problem is that the return value for taskPool.amap can't be a tuple of tuples or a tuple of struct. Either way, it fails with the Wrong buffer type error message if I uncomment the taskPool line

import std.algorithm, std.parallelism, std.range;
import std.typecons;
import std.meta;
import std.stdio;

// define some input measurement sample tuples and output metric tuples

struct TR { long raw; double per_cyc;}
//alias TR = Tuple!(long, "raw", double, "per_cyc");
alias TI = Tuple!(long, "L1I_MISS",long, "L1D_MISS", long, "L1D_READ", long, "L1D_WRITE", long, "cycles" );
alias TO = Tuple!(TR, "L1_MISS", TR, "L1D_ACCESS");

// various metric definitions
// using Tuples with defined names for each member, and use the names here in the metrics. TR met_l1_miss ( ref TI m){ TR rv; rv.raw = m.L1I_MISS+m.L1D_MISS; rv.per_cyc = cast(double)rv.raw/m.cycles; return rv; } TR met_l1_access ( ref TI m){ TR rv; rv.raw = m.L1D_READ+m.L1D_WRITE; rv.per_cyc = cast(double)rv.raw/m.cycles; return rv; }

// a convenience to use all the metrics above as a list
alias Metrics = AliasSeq!(met_l1_miss, met_l1_access);

void main(string[] argv)
{
        auto samples = iota(100);
        auto meas = new TI[samples.length];
        auto results = new TO[samples.length];

        // Initialize some values for the measured samples
        foreach(i, ref m; meas){
                m.L1D_MISS= 100+i; m.L1I_MISS=100-i;
                m.L1D_READ= 200+i; m.L1D_WRITE=200-i;
                m.cycles= 10+i;
        }

    ref TI getTerm(int i)
    {
        return meas[i];
    }

// compute the metric results for the above measured sample values in parallel
        //taskPool.amap!(Metrics)(std.algorithm.map!getTerm(samples),results);

        TR rv1 = met_l1_miss( meas[1]);
        TR rv2 = met_l1_access( meas[1]);

        writeln("measurements:", meas[1]);
        writeln("rv1:", rv1);
        writeln("rv2:", rv2);
        writeln("results:", results[1]);

}

Reply via email to