如何让 Berkeley UPC 处理复数?

How to make Berkeley UPC work with complex numbers?

我在笔记本电脑上编译带有复数的 UPC 代码时遇到一些问题 (Mac OS-X;代码最终会 运行 在 Linux CentOS 机器上)。我试图在代码中使用 FFTW,但返回了很多错误。

#include </Users/avinash/Programs/fftwinstall/include/fftw3.h>
Error during remote HTTP translation:
upcc: error during UPC-to-C translation (sgiupc stage): 
In file included from code1xc.upc:9:
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: warning: type defaults to `int' in declaration of `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: warning: data definition has no type or storage class
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
/Users/avinash/Programs/fftwinstall/include/fftw3.h:373: syntax error before `fftwq_complex'
......

然后我做了一些 google 搜索,我发现了这个 link – https://hpcrdm.lbl.gov/pipermail/upc-users/2013-December/001758.html

显然,BUPC 不适用于某些平台上的复数 - http://upc.lbl.gov/docs/user/index.shtml

Programs which #include complex.h, and/or tgmath.h do not work on
    certain platforms.

所以尝试使用在线查询中提到的 complex.h 编译这个简单的代码,甚至返回错误。

#include <upc.h>
#include <complex.h>
int main()
{
  return 0;
}
Error during remote HTTP translation:
upcc: error during UPC-to-C translation (sgiupc stage): 
In file included from code1xc.upc:7:
/usr/include/complex.h:45: syntax error before `cacosf'
/usr/include/complex.h:46: syntax error before `cacos'
/usr/include/complex.h:47: syntax error before `cacosl'
/usr/include/complex.h:49: syntax error before `casinf'
/usr/include/complex.h:50: syntax error before `casin'
....

那么,我究竟做错了什么?我将不胜感激任何帮助。这是仅针对 Berkeley UPC 还是 GNU UPC 的问题?我的项目需要共享复杂数组。我认为一定有办法,因为在线讲座中多次提到 FFT。 感谢您的帮助!!

便携式 UPC 程序不依赖于 C99 的 complex.h header,因为并非所有 compilers/systems 都普遍支持它。相反,他们通常将自己的复杂类型定义为 two-element 结构。

例如看这个simple FT implementation

另一种常见的方法是根据应用程序的需要和任何客户端数学库期望的数据布局,保留单独的实部和虚部数组。

但是,如果您需要复数三角函数或使用专门依赖于 C99 复数的库,这些都不太可能有帮助。假设您有一个支持复数的 C 编译器,您可以使用它来编译链接到您的 UPC 程序的串行模块。或者你可以尝试 clang UPC 前端,我相信它在某些平台上支持 C99 complex。