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
0 件のコメント:
コメントを投稿