SIMD under LDC

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 4 16:06:27 PDT 2017


On Monday, 4 September 2017 at 20:39:11 UTC, Igor wrote:
> I found that I can't use __simd function from core.simd under 
> LDC

Correct LDC does not support the core.simd interface.

> and that it has ldc.simd but I couldn't find how to implement 
> equivalent to this with it:
>
> ubyte16* masks = ...;
> foreach (ref c; pixels) {
> 	c = __simd(XMM.PSHUFB, c, *masks);
> }
>
> I see it has shufflevector function but it only accepts 
> constant masks and I am using a variable one. Is this possible 
> under LDC?

You have several options:
* write a regular for loop and let LDC's optimiser take care of 
the rest.

alias mask_t = ReturnType!(equalMask!ubyte16);
pragma(LDC_intrinsic, "llvm.masked.load.v16i8.p0v16i8")
     ubyte16 llvm_masked_load(ubyte16* val,int align, mask_t mask, 
ubyte16 fallthru);

ubyte16* masks = ...;
foreach (ref c; pixels) {
         auto mask = equalMask!ubyte16(*masks, [-1,-1,-1, ...]);
	c = llvm_masked_load(&c,16,mask, [0,0,0,0 ... ]);
}

The second one might not work, because of type differences in 
llvm, but should serve as a guide to hacking the `cmpMask` IR 
code in ldc.simd to do what you want it to.

> BTW. Shuffling channels within pixels using DMD simd is about 5 
> times faster than with normal code on my machine :)

Don't underestimate ldc's optimiser ;)


More information about the Digitalmars-d-learn mailing list