How to use math functions in dcompute?
Nicholas Wilson
iamthewilsonator at hotmail.com
Fri Aug 31 13:30:10 UTC 2018
On Thursday, 30 August 2018 at 10:34:33 UTC, Sobaya wrote:
> On Monday, 27 August 2018 at 12:47:45 UTC, Nicholas Wilson
> wrote:
>> On Monday, 27 August 2018 at 09:57:18 UTC, Sobaya wrote:
>>> On Monday, 27 August 2018 at 09:41:34 UTC, 9il wrote:
>>>> On Monday, 27 August 2018 at 08:25:14 UTC, Sobaya wrote:
>>>>> I'm using dcompute(https://github.com/libmir/dcompute).
>>>>>
>>>>> In the development, I have got to use math functions such
>>>>> as sqrt in @compute function.
>>>>>
>>>>> But LDC says "can only call functions from other @compute
>>>>> modules in @compute code", so can't I call any math
>>>>> functions with dcompute?
>>>>>
>>>>> Is there any way to use predefined math functions in
>>>>> dcompute?
>>>>>
>>>>> Thanks.
>>>>
>>>> You may want to try ldc.intrinsics / mir.math.common
>>>
>>> Do you mean llvm_sqrt in ldc.intrinsics?
>>>
>>> These functions are also not @compute code, so they cause the
>>> same error.
>>
>> Thanks for bringing this to my attention, will fix soon. In
>> the meantime you may declare your own intrinsics in a @compute
>> module and it should work. as in
>>
>> @compute module mymath;
>>
>> pragma(LDC_intrinsic, "llvm.sqrt.f#")
>> T llvm_sqrt(T)(T val)
>> if (__traits(isFloating, T));
>>
>>
>> This will work if you are targeting CUDA, SPIRV may not like
>> it because the backend is less... mature.
>
> Thank you for replaying.
>
> Surely the definition you told me works for "sqrt".
> But "cos" and "sin" does not work.
> The error message is
>
> LLVM ERROR: Cannot select: 0xd76ffd8: f32 = fcos
> ConstantFP:f32<0.000000e+00>
> 0xd76ff70: f32 = ConstantFP<0.000000e+00>
>
> What's wrong?
SPIR-V or CUDA?
for SPIR-V try
pragma(mangle, "_Z3sinf")
float sin(float);
pragma(mangle, "_Z3cosf")
float cos(float);
more generally see
https://github.com/KhronosGroup/SPIR-Tools/wiki/SPIR-2.0-built-in-functions
If this is a problem with CUDA you could try using the NVPTX
intrinsics
pragma(LDC_intrinsic, "llvm.nvvm.namegoeshere")
T namegoeshere(Args a);
If you need to use both SPIR-V and CUDA then see the hackery e.g.
https://github.com/libmir/dcompute/blob/master/source/dcompute/std/index.d#L45
LLVM will be released on September 5th I will fix up this shortly
after.
Sorry for the alpha state of things right now.
Nic
More information about the Digitalmars-d-learn
mailing list