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
}
struct Pointer(T, AddressSpace type = AddressSpace.Generic)
// ...
?
is there anything else that I'm missing that you can do with a
raw pointer?
Slicing:
// Pseudo OpenCL-D
groupLocal T* ptr1;
groupLocal T[] slice1 = ptr1[2 .. 10];
global T* ptr2;
groupLocal T[] slice2 = ptr2[0 .. 2]; // Error