Q0:
cuComplex.h是否支持exp()?
Q1:
如何写A=B* exp(i * C),其中A,B,C是相同大小的实数数组?是这样的吗?
main:
cuComplex A;
float B;
cuComplex c;
内核:
c[idx] = ( 0, C[idx] );
A[idx] = B[idx] * exp( c[idx] );
Q2:
cuComplex包含2个浮点数,这意味着我必须分配比原始矩阵多2倍的内存。有没有办法创建纯虚数?
发布于 2012-03-25 18:59:11
H只提供了cuComplex上的一些基本操作(主要是那些在CUBLAS和CUFFT库中使用的操作),不支持指数函数。
您可以使用基于组件的算法自己实现指数。cuComplex将复数的实部存储在x分量中,将虚部存储在y分量中。给定一个复数z=x+ i*y,指数可以计算为:
exp(z) = exp(x) * (cos(y) +i* sin(y))
这将导致以下CUDA代码(未经测试):
cuComplex my_complex_exp (cuComplex arg)
{
cuComplex res;
float s, c;
float e = expf(arg.x);
sincosf(arg.y, &s, &c);
res.x = c * e;
res.y = s * e;
return res;
}
发布于 2020-08-26 17:08:30
Thrust现在也支持complex exponentials。
没有必要以其他方式使用推力来实现此功能。您可以包含推力复杂的头文件,并在普通CUDA代码中使用这些结构。
$ cat t1793.cu
#include <cuComplex.h>
#include <thrust/complex.h>
#include <stdio.h>
__host__ __device__
cuFloatComplex my_complex_exp (cuFloatComplex arg)
{
cuFloatComplex res;
float s, c;
float e = expf(arg.x);
sincosf(arg.y, &s, &c);
res.x = c * e;
res.y = s * e;
return res;
}
__global__ void demo(){
cuFloatComplex a = make_cuFloatComplex(1.0f, 1.0f);
thrust::complex<float> b(1.0f, 1.0f);
printf("thrust: %f,%f, cuComplex: %f,%f\n", exp(b).real(), exp(b).imag(), cuCrealf( my_complex_exp(a)), cuCimagf(my_complex_exp(a)));
}
int main(){
demo<<<1,1>>>();
cudaDeviceSynchronize();
}
$ nvcc -o t1793 t1793.cu
$ cuda-memcheck ./t1793
========= CUDA-MEMCHECK
thrust: 1.468694,2.287355, cuComplex: 1.468694,2.287355
========= ERROR SUMMARY: 0 errors
$
https://stackoverflow.com/questions/9860711
复制