MacPortsのOctaveがATLASに移行してしまい, Accelerateを使わなくなった. ATLASはコンパイルに時間がかかる上, g95がサポートされていない. ATLASがg95サポートするようにしてもよいのだが, OSに添付され最適化されているAccelerate frameworkを使いたい. そこでAccelerateを復活させようとしている.
問題となるのは, OctaveのconfigureでCDOTU, ZDOTUのテストにSegmentation faultなどが出て失敗することである.
原因は, AccelerateはCBLASなのでCやg77のABIに従い, 返り値が複素数を指すポインタであるのに, g95, gfortranは浮動小数点レジスタファイルであること. gfortranでは-ff2cとすることで解決する. g95ではラッパが必要. Appleが示したラッパをちょっとだけ改変して関数名に_をつけたので, ラッパは-fno-underscoringをつけてコンパイルするが, 呼び出し側ではオプションは不要.
2010-11-20追記: githubにて公開. MacPortsを使ってインストール可.
!g95 -fno-underscoring dotwrp.f90 -c double complex function zdotc_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotc_sub(%val(n), zx, %val(incx), zy, %val(incy), z) zdotc_ = z return end double complex function zdotu_(n, zx, incx, zy, incy) double complex zx(*), zy(*), z integer n, incx, incy call cblas_zdotu_sub(%val(n), zx, %val(incx), zy, %val(incy), z) zdotu_ = z return end complex function cdotc_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotc_sub(%val(n), cx, %val(incx), cy, %val(incy), c) cdotc_ = c return end complex function cdotu_(n, cx, incx, cy, incy) complex cx(*), cy(*), c integer n, incx, incy call cblas_cdotu_sub(%val(n), cx, %val(incx), cy, %val(incy), c) cdotu_ = c return end