我將我的C++代碼移植到CUDA & CUBLAS。我使用stl :: complex進行復雜計算(例如pow,log,exp等),但是我沒有看到在CuComplex庫中定義的相同函數。我不知道如何創建這些功能,但我發現了一些在線代碼如何在CUBLAS中做複數的權力?
#include <iostream>
#include <cublas_v2.h>
#include <cuComplex.h>
using namespace std;
typedef cuDoubleComplex Complex;
#define complex(x, y) make_cuDoubleComplex(x, y)
__host__ __device__ double cabs(const Complex& z) {return cuCabs(z);}
__host__ __device__ double carg(const Complex& z) {return atan2(cuCreal(z), cuCimag(z));}
__host__ __device__ Complex polar(const double &magnitude, const double &angle) {return complex(magnitude*cos(angle), magnitude*sin(angle));}
__host__ __device__ Complex cexp(const Complex& z) {return polar(exp(cuCreal(z)), cuCimag(z));}
__host__ __device__ Complex czlog(const Complex& z) {return complex(::log(cabs(z)), carg(z));}
__host__ __device__ Complex cpow(const Complex& z, const int &exponent) {return cexp(cuCmul(czlog(z), complex((double)exponent, 0)));}
void main(void)
{
Complex z=complex(0.34, 0.56);
cout << cuCreal(cpow(z, 2)) << " " << cuCimag(cpow(z, 2)) << endl;
}
以上結果並沒有給出正確的答案。 cpow有什麼問題嗎?複數的功能和其他功能是否更好?
cuComplex.h只提供CUBLAS和CUFFT所需的一些複雜操作。考慮提交功能請求,以獲得更全面的CUDA複雜數據操作支持。您可以通過從註冊的開發者網站鏈接的錯誤報告表單來完成此操作。 – njuffa
@njuffa我有同樣的問題,並在[NVIDIA論壇](https://devtalk.nvidia.com/default/topic/549254/complex-arithmetics-in-cuda/)和[StackOverflow](http: //stackoverflow.com/questions/17405715/complex-arithmetics-in-cuda)。根據您對論壇的建議,我還通過7月份的錯誤報告系統表格提交了增強請求。一位SO用戶將我引導至此[CUDA Complex Library](https://github.com/jtravs/cuda_complex),這可能對其他用戶也有用。我已通知該圖書館存在的錯誤報告系統。 – JackOLantern
[cusp](http://code.google.com/p/cusp-library/wiki/QuickStartGuide)也有[複雜的實現](http://code.google.com/p/cusp-library/source /browse/cusp/complex.h),這可能會對某些用戶感興趣。 –