ndslice: convert a sliced object to T[]

data pulverizer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 15 06:13:05 PDT 2016


On Wednesday, 15 June 2016 at 12:10:32 UTC, Seb wrote:
> As said you can avoid the copy (see below). I also profiled it 
> a bit and it was interesting to see that 50% of the runtime are 
> spent on generating the random matrix. On my machine now both 
> scripts take 1.5s when compiled with

I didn't benchmark the RNG but I did notice it took a lot of time 
to generate the matrix but for now I am focused on the BLAS side 
of things.

I am puzzled about how your code works:

Firstly:
I didn't know that you could substitute an array for its first 
element in D though I am aware that a pointer to an array's first 
element is equivalent to passing the array in C.
>
> auto matrix_mult(T)(T[] A, T[] B, Slice!(2, T*) a, Slice!(2, 
> T*) b){
> 	...
>     gemm(Order.ColMajor, Transpose.NoTrans, Transpose.NoTrans, 
> M, N, K, 1., A.ptr, K, B.ptr, N, 0, C.ptr, N);
> 	return C.sliced(M, N);
> }
>

Secondly:
I am especially puzzled about using the second element to stand 
in for the slice itself. How does that work? And where can I find 
more cool tricks like that?

> void main()
> {
> 	...
> 	auto C = matrix_mult(ta[0], tb[0], ta[1], tb[1]);
> 	sw.stop();
> 	writeln("Time taken: \n\t", sw.peek().msecs, " [ms]");
> }
>

Many thanks!



More information about the Digitalmars-d-learn mailing list