Second class pointers

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jul 8 05:06:59 PDT 2016


On Friday, 8 July 2016 at 11:05:36 UTC, ZombineDev wrote:
> On Friday, 8 July 2016 at 06:17:43 UTC, Nicholas Wilson wrote:
>> On Friday, 8 July 2016 at 05:53:21 UTC, Nicholas Wilson wrote:
>>> So as part of my effort to get D running on GPUs I need to 
>>> make a "second class" pointer type that I can alter in the 
>>> backend of LDC to the correct address space. to that end I 
>>> have made the following
>>>
>>> module dcompute.types.pointer;
>>>
>>> enum Private = 0;
>>> enum Global = 1;
>>> enum Shared = 2;
>>> enum Constant = 3;
>>> enum Generic = 4;
>>>
>>> pure @trusted nothrow @nogc
>>> struct Pointer(uint p, T) if(p <= Generic)
>>> {
>>>     T* ptr;
>>>     ref T opUnary(string op)() if(op=="*")
>>>     {
>>>         return *ptr;
>>>     }
>>>     ref T opIndex(size_t i)
>>>     {
>>>         return *(ptr+i);
>>>     }
>>>     auto opBinary(string op)(ptrdiff_t i) if(op=="+" || op == 
>>> "-")
>>>     {
>>>          return Pointer!(p, T) (ptr + i);
>>>     }
>>> }
>>>
>>> ...
>>
>> That should be mixin("ptr"~op~"i")
>> I need compound add and compound subtract as well.
>
> Why not make the address (memory) space a strongly-typed enum, 
> e.g.:
>
> enum AddressSpace
> {
>     threadLocal = 0,
>     groupLocal = 1,
>     global = 2,
>     constant = 3,
>     texture = 4
>     generic = 5
> }
>
because it'll change the mangling and I just want to get it 
working first, also there will be aliases for all the things 
anyway. (also AFAIU there is no texture address space its just 
fancy caching)

> struct Pointer(T, AddressSpace type = AddressSpace.Generic)
> // ...
>
> ?
>
>>> is there anything else that I'm missing that you can do with 
>>> a raw pointer?
>
> Slicing:
>
That's creating a new variable based on the pointer as {$-offset, 
ptr + offset} not a primitive, but I take your point.

> // Pseudo OpenCL-D
>
> groupLocal T* ptr1;
> groupLocal T[] slice1 = ptr1[2 .. 10];
>
> global T* ptr2;
> groupLocal T[] slice2 = ptr2[0 .. 2]; // Error

I REALLY want to avoid having to make them qualifiers and that 
means I have to hack DMDFE as well as LDC.


More information about the Digitalmars-d-learn mailing list