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