www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to use math functions in dcompute?

reply Sobaya <sobaya007 gmail.com> writes:
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.
Aug 27 2018
parent reply 9il <ilyayaroshenko gmail.com> writes:
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
Aug 27 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
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.
Aug 27 2018
next sibling parent 9il <ilyayaroshenko gmail.com> writes:
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.
Ah, interesting
Aug 27 2018
prev sibling parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
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.
Aug 27 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
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?
Aug 30 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
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
Aug 31 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Friday, 31 August 2018 at 13:30:10 UTC, Nicholas Wilson wrote:
 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
Sorry for being late for reply. I'm using CUDA for back-end. So you mean if required function is "cos", pragma(LDC_intrinsic, "llvm.nvv.cos") T cos(T a); Is it right? I tried this declaration, but I got an error diffrent from previous one: dcompute.driver.error.DComputeDriverException ../../.dub/packages/dcompute-master/dcompute/source/dcompute/ river/error.d(172): cast(Status)218 ---------------- ??:? [0x48739e] ??:? [0x48f8aa] ??:? [0x47942d] error.d:172 [0x42fe61] error.d:167 [0x42fdb4] error.d:187 [0x42feca] program.d:30 [0x42fc00] app.d:13 [0x417bea] ??:? [0x47908f] ??:? [0x478f85] __entrypoint.d:8 [0x4289f4] ??:? __libc_start_main [0x2b85f455282f] ??:? [0x405c08] Program exited with code 1 My declaration is wrong? Or fixed LLVM(LDC?) is already released? How can I use it ?
Sep 06 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Friday, 7 September 2018 at 06:45:32 UTC, Sobaya wrote:
 Sorry for being late for reply.

 I'm using CUDA for back-end.

 So you mean if required function is "cos",

 pragma(LDC_intrinsic, "llvm.nvv.cos")
 T cos(T a);

 Is it right?
You're missing an "m" in "nvvm", dunno if that will fix it.
 I tried this declaration, but I got an error diffrent from 
 previous one:

 dcompute.driver.error.DComputeDriverException ../../.dub/packages/dcompute-master/dcompute/source/dcompute/
river/error.d(172): cast(Status)218
 ----------------
 ??:? [0x48739e]
 ??:? [0x48f8aa]
 ??:? [0x47942d]
 error.d:172 [0x42fe61]
 error.d:167 [0x42fdb4]
 error.d:187 [0x42feca]
 program.d:30 [0x42fc00]
 app.d:13 [0x417bea]
 ??:? [0x47908f]
 ??:? [0x478f85]
 __entrypoint.d:8 [0x4289f4]
 ??:? __libc_start_main [0x2b85f455282f]
 ??:? [0x405c08]
 Program exited with code 1

 My declaration is wrong?

 Or fixed LLVM(LDC?) is already released?

 How can I use it ?
I'll be adding these to DCompute soon (probably Sunday), LLVM7.0 has just been released and I've been waiting on that to do testing.
Sep 07 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Friday, 7 September 2018 at 10:17:47 UTC, Nicholas Wilson 
wrote:
 On Friday, 7 September 2018 at 06:45:32 UTC, Sobaya wrote:
[...]
You're missing an "m" in "nvvm", dunno if that will fix it.
 [...]
I'll be adding these to DCompute soon (probably Sunday), LLVM7.0 has just been released and I've been waiting on that to do testing.
I understand about the release. But missing "m" is just my typo here. I wrote "llvm.nvvm.cos" correctly on my code, and error occurred.
Sep 07 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Friday, 7 September 2018 at 10:53:25 UTC, Sobaya wrote:
 On Friday, 7 September 2018 at 10:17:47 UTC, Nicholas Wilson 
 wrote:
 On Friday, 7 September 2018 at 06:45:32 UTC, Sobaya wrote:
[...]
You're missing an "m" in "nvvm", dunno if that will fix it.
 [...]
I'll be adding these to DCompute soon (probably Sunday), LLVM7.0 has just been released and I've been waiting on that to do testing.
I understand about the release. But missing "m" is just my typo here. I wrote "llvm.nvvm.cos" correctly on my code, and error occurred.
I'm waiting for the update. How's your progress? Still it doesn't work well in my environment. If you know temporary solution for use "cos" or "sin", I want to try it. Thank you.
Sep 17 2018
next sibling parent Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 On Friday, 7 September 2018 at 10:53:25 UTC, Sobaya wrote:
 On Friday, 7 September 2018 at 10:17:47 UTC, Nicholas Wilson 
 wrote:
 On Friday, 7 September 2018 at 06:45:32 UTC, Sobaya wrote:
[...]
You're missing an "m" in "nvvm", dunno if that will fix it.
 [...]
I'll be adding these to DCompute soon (probably Sunday), LLVM7.0 has just been released and I've been waiting on that to do testing.
I understand about the release. But missing "m" is just my typo here. I wrote "llvm.nvvm.cos" correctly on my code, and error occurred.
I'm waiting for the update. How's your progress? Still it doesn't work well in my environment. If you know temporary solution for use "cos" or "sin", I want to try it. Thank you.
Sorry you need to add a size for the argument "llvm.nvvm.cos.f32" for float or copy what is done in ldc/intrinsics.di with a template for "llvm.nvvm.cos.f#"
Sep 17 2018
prev sibling parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
Sep 17 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Tuesday, 18 September 2018 at 01:39:51 UTC, Nicholas Wilson 
wrote:
 On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
I declared like: pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") T cos(T)(T val) if (__traits(isFloating, T)); It also doesn't work.
Sep 17 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Tuesday, 18 September 2018 at 06:25:33 UTC, Sobaya wrote:
 On Tuesday, 18 September 2018 at 01:39:51 UTC, Nicholas Wilson 
 wrote:
 On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
I declared like: pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") T cos(T)(T val) if (__traits(isFloating, T)); It also doesn't work.
pragma(LDC_intrinsic, "llvm.nvvm.cos.f#") // note the # in place of 32 T cos(T)(T val) if (__traits(isFloating, T)); (Just don't use real with it.) OR pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") float cos(float val)
Sep 18 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Wednesday, 19 September 2018 at 00:11:13 UTC, Nicholas Wilson 
wrote:
 On Tuesday, 18 September 2018 at 06:25:33 UTC, Sobaya wrote:
 On Tuesday, 18 September 2018 at 01:39:51 UTC, Nicholas Wilson 
 wrote:
 On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
I declared like: pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") T cos(T)(T val) if (__traits(isFloating, T)); It also doesn't work.
pragma(LDC_intrinsic, "llvm.nvvm.cos.f#") // note the # in place of 32 T cos(T)(T val) if (__traits(isFloating, T)); (Just don't use real with it.) OR pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") float cos(float val)
And if they don't work, use
  pragma(LDC_intrinsic, "llvm.cos.f#") // note the # in place of 
 32
 T cos(T)(T val)
      if (__traits(isFloating, T));
 (Just don't use real with it.)
Sep 18 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Wednesday, 19 September 2018 at 00:22:44 UTC, Nicholas Wilson 
wrote:
 On Wednesday, 19 September 2018 at 00:11:13 UTC, Nicholas 
 Wilson wrote:
 On Tuesday, 18 September 2018 at 06:25:33 UTC, Sobaya wrote:
 On Tuesday, 18 September 2018 at 01:39:51 UTC, Nicholas 
 Wilson wrote:
 On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
I declared like: pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") T cos(T)(T val) if (__traits(isFloating, T)); It also doesn't work.
pragma(LDC_intrinsic, "llvm.nvvm.cos.f#") // note the # in place of 32 T cos(T)(T val) if (__traits(isFloating, T)); (Just don't use real with it.) OR pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") float cos(float val)
And if they don't work, use
  pragma(LDC_intrinsic, "llvm.cos.f#") // note the # in place 
 of 32
 T cos(T)(T val)
      if (__traits(isFloating, T));
 (Just don't use real with it.)
"llvm.nvvm.cos.f#" and "llvm.nvvm.cos.f32" don't work. And when I use "llvm.cos.f#", Another error occurred in linking. LLVM ERROR: Cannot select: 0xe0d4798: f32 = fcos ConstantFP:f32<0.000000e+00> 0xe0b9db0: f32 = ConstantFP<0.000000e+00>
Sep 19 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Thursday, 20 September 2018 at 05:16:04 UTC, Sobaya wrote:
 On Wednesday, 19 September 2018 at 00:22:44 UTC, Nicholas 
 Wilson wrote:
 On Wednesday, 19 September 2018 at 00:11:13 UTC, Nicholas 
 Wilson wrote:
 On Tuesday, 18 September 2018 at 06:25:33 UTC, Sobaya wrote:
 On Tuesday, 18 September 2018 at 01:39:51 UTC, Nicholas 
 Wilson wrote:
 On Tuesday, 18 September 2018 at 00:25:33 UTC, Sobaya wrote:
 I'm waiting for the update. How's your progress?
I t appears I have broke SPIR-V completely somewhere along the line, I may release a v0.2 with out it, hopefully within the week.
I declared like: pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") T cos(T)(T val) if (__traits(isFloating, T)); It also doesn't work.
pragma(LDC_intrinsic, "llvm.nvvm.cos.f#") // note the # in place of 32 T cos(T)(T val) if (__traits(isFloating, T)); (Just don't use real with it.) OR pragma(LDC_intrinsic, "llvm.nvvm.cos.f32") float cos(float val)
And if they don't work, use
  pragma(LDC_intrinsic, "llvm.cos.f#") // note the # in place 
 of 32
 T cos(T)(T val)
      if (__traits(isFloating, T));
 (Just don't use real with it.)
"llvm.nvvm.cos.f#" and "llvm.nvvm.cos.f32" don't work. And when I use "llvm.cos.f#", Another error occurred in linking. LLVM ERROR: Cannot select: 0xe0d4798: f32 = fcos ConstantFP:f32<0.000000e+00> 0xe0b9db0: f32 = ConstantFP<0.000000e+00>
Hmm, I can reproduce. Will look into it.
Sep 20 2018
parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Thursday, 20 September 2018 at 12:43:02 UTC, Nicholas Wilson 
wrote:
 Hmm, I can reproduce. Will look into it.
pragma(LDC_intrinsic, "llvm.nvvm.cos.approx.f") float cos(float val); does work but is an approximation.
Sep 20 2018
parent reply Sobaya <sobaya007 gmail.com> writes:
On Thursday, 20 September 2018 at 12:48:14 UTC, Nicholas Wilson 
wrote:
 On Thursday, 20 September 2018 at 12:43:02 UTC, Nicholas Wilson 
 wrote:
 Hmm, I can reproduce. Will look into it.
pragma(LDC_intrinsic, "llvm.nvvm.cos.approx.f") float cos(float val); does work but is an approximation.
It works for me. I'll use it currently. Thanks!
Sep 24 2018
parent naetherm <naether.markus gmail.com> writes:
On Tuesday, 25 September 2018 at 05:18:55 UTC, Sobaya wrote:
 On Thursday, 20 September 2018 at 12:48:14 UTC, Nicholas Wilson 
 wrote:
 On Thursday, 20 September 2018 at 12:43:02 UTC, Nicholas 
 Wilson wrote:
 Hmm, I can reproduce. Will look into it.
pragma(LDC_intrinsic, "llvm.nvvm.cos.approx.f") float cos(float val); does work but is an approximation.
It works for me. I'll use it currently. Thanks!
FYI: Using pragma(LDC_intrinsic, "llvm.nvvm.cos.f#") // note the # in place of 32 T cos(T)(T val) if (__traits(isFloating, T)); seems to work now.
Feb 24