Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std.parallelism taskPool.amap compilation error for array of tuple of tuple or tuple of struct results #10143

Open
dlangBugzillaToGithub opened this issue Oct 1, 2015 · 0 comments

Comments

@dlangBugzillaToGithub
Copy link

jayn reported this on 2015-10-01T20:33:52Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=15135

Description

This generates the following compile error if I uncomment the taskPool.amap line.  The TR definition causes the amap error for either struct or Tuple definitions.

Ali Cehreli did some analysis in the thread:
http://forum.dlang.org/post/dtebpnktznzdusnontkn@forum.dlang.org


Severity	Code	Description	Project	File	Line
Error		Error: static assert  "Wrong buffer type."		C:\D\dmd2\src\phobos\std\parallelism.d	1668
Error		instantiated from here: amap!(MapResult!(getTerm, Result), Tuple!(TR, "L1_MISS", TR, "L1D_ACCESS")[])		d:\visd\dmapbug\dmapbug\main.d	40


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]);

}
@LightBender LightBender removed the P3 label Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants