Accelerateのcdotu, cdotc, zdotc, zdotuで出るsegmentation faultを回避する

2010年8月9日

Accelerate g95 LAPACK Mac Octave

t f B! P L
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

このブログを検索

ブログ アーカイブ

Translate

QooQ