I am new to Cuda, I have the following function:
__global__ void square(float *myArrayGPU)
{
myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
}
I want to use the cuda math library, I tried to #include "math.h"
but I still get the error
error: calling a __host__ function("__sqrt") from a __global__ function("square") is not allowed
Any idea what library should I include to use the sqrt
?
The sqrt() function is defined in math. h header file. To find the square root of int , float or long double data types, you can explicitly convert the type to double using cast operator. int x = 0; double result; result = sqrt(double(x));
Available to any CUDA C or CUDA C++ application simply by adding “#include math. h” in your source code, the CUDA Math library ensures that your application benefits from high performance math routines optimized for every NVIDIA GPU architecture.
Using the CUDA Toolkit you can accelerate your C or C++ applications by updating the computationally intensive portions of your code to run on GPUs. To accelerate your applications, you can call functions from drop-in libraries as well as develop custom applications using languages including C, C++, Fortran and Python.
threadIdx.x
is of type int. CUDA math library is overloaded only for single precision (float
) and double precision (double
). You need to supply either a 'float' or 'double' type parameter to sqrt()
for the CUDA version of sqrt()
to be called.
Change
myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
into
myArrayGPU[threadIdx.x] = sqrt( (float) threadIdx.x);
For more detailed information, take a look at the CUDA sqrt() prototype documentation.
sqrt
expects a floating type variable. Try sqrt((float)(threadIdx.x))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With