PowerPC 用にコンパイルおよびテストされた、編集できないレガシー コードを使用しています。一般的な Linux ボックス (Ubuntu 11.10 x64) 用にビルドするビルド システムを作成しようとしています。
clpack (Ver. 3.2.1) に含まれる汎用 blas ライブラリの f2c バージョンをラップする cblas に似たカスタム インターフェイスを備えています。つまり、Linux マシンで clpack ソースから liblapack、libblas、および libf2c をコンパイルし、次のサンプル コードにリンクします。
int main()
{
double a[3] = {100,200,300};
// Scale all elements of a by 0.1
// This uses a custom wrapper that seg. faults
mycblas_dscal(3,0.1,a,1);
}
void mycblas_dscal(int N, double scale, double* data, int inc)
{
dscal_((int*) &N, (double*) &scale, data, (int*) &inc);
}
mycblas_dscal
blas ライブラリの実装を呼び出すだけdscal_
です。ただし、ライブラリはすべてのデータのポインターを想定しており、このラッパーは現在、 と のアドレスをN
直接scale
渡しinc
ます。これらは値渡しであり、多くの場合リテラルであるため、これは私を怖がらせます。
実行さmycblas_dscal
れると、何もしないことがよくあります。つまりa
、変更されていないか、セグメント化されています。障害。より高度なコンパイラの最適化 (gcc -O3 など) を使用すると、セグメント化のみが行われます。障害。
blas ライブラリをテストするには、次のコードが正常に機能します。
int main()
{
// This calls the library directly and works fine but I cannot edit
//the rest of the code which is using the wrapped version above.
int size = 3;
double scale = 0.1;
int inc = 1;
dscal_(&size,&scale,a,&inc);
}
私の唯一の洞察は、seg. コンパイラの最適化により、フォールトの動作が悪化します。詳しく調べるほどの知識はありません。何か案は?