none
linuxからwindowsへ移植したコードがmlockでエラーになる RRS feed

  • 質問

  • どなたか教えてください。

    ある研究で使われている最小二乗法で求めるソースをlinuxからwindowsへ移植したところ、Vec_DP b(ndata),afunc(ma);という記述のところでエラーになってしまいます。

    デバッグでみると、どうやら"mlock"で排他エラーとなるようなのですが、いろいろ調べたところwindowsでメモリ排他を行う場合、"mlock()"ではなく"virtuallock()"が使える?という情報にたどり着きました。

    実際のところ、"mlock"が原因なのか、ソースに原因があるのかわかりません。

    また、どうやってvirtuallock()に変更するのかもわかりません。

    当方「C++」は未熟な為、質問自体をご理解いただけるかどうか不安もありますが、なにか良いアドバイスや情報がございましたらどなたか教えてください。

    開発環境 microsoft visual C++ 2010 express エディション

    OS:windows VISTA (ULTIMATE)32bit

    CPPソースコード=======================================

      if (singular>point_15){
       range1=singular;
       svdfit(range1, x, y, a, u, v, w, chisq, funcs);         <===== ここで下記ヘッダファイルに移る
              svdvar(v,w,cvm);
       estimateO2=a[0]+a[1]*exp(-(time_15-t[0])*STPD/volume);
       changeO2=-a[1]*exp(-(time_15-t[0])*STPD/volume)*STPD/volume;

       svdfit(range1, x, z, a, u, v, w, chisq, funcs);
              svdvar(v,w,cvm);
       estimateCO2=a[0]+a[1]*exp(-(time_15-t[0])*STPD/volume);
       changeCO2=-a[1]*exp(-(time_15-t[0])*STPD/volume)*STPD/volume;
       }

    ヘッダファイル ソースコード =====================================

    #include "nr.h"

    void svdfit(int &n, Vec_I_DP &x, Vec_I_DP &y, Vec_O_DP &a,
     Mat_O_DP &u, Mat_O_DP &v, Vec_O_DP &w, DP &chisq,
     void funcs(const DP, Vec_O_DP &))
    {
     int i,j;
     const DP TOL=1.0e-13;
     DP wmax,tmp,thresh,sum;

     int ndata=n;
     int ma=a.size();
     Vec_DP b(ndata),afunc(ma);                     <==ここでエラーとなる。
     for (i=0;i<ndata;i++) {
      funcs(x[i],afunc);
      tmp=1.0;
      for (j=0;j<ma;j++) u[i][j]=afunc[j]*tmp;
      b[i]=y[i]*tmp;
     }
     svdcmp(u,w,v);
     wmax=0.0;
     for (j=0;j<ma;j++)
      if (w[j] > wmax) wmax=w[j];
     thresh=TOL*wmax;
     for (j=0;j<ma;j++)
      if (w[j] < thresh) w[j]=0.0;
     svbksb(u,w,v,b,a);
     chisq=0.0;
     for (i=0;i<ndata;i++) {
      funcs(x[i],afunc);
      sum=0.0;
      for (j=0;j<ma;j++) sum += a[j]*afunc[j];
      chisq += (tmp=(y[i]-sum),tmp*tmp);
     }
    }

     

    2010年11月18日 10:52

回答

  • Numerical Recipesですか?

    メモリの確保はどのように行っているのでしょうか?

    どのAPIを利用しているのでしょうか?CRTのmallocですか?

    また、”mlockで排他エラーとなる”とは具体的にどのような状況でしょうか?

    そのmlock関数は誰が用意しているのでしょうか?mlock関数は自分で移植されたのでしょうか?

     

    >エラーになってしまいます

    >いろいろ調べたところ

    これらの情報が具体的に必要かなと思います。

     

    ちなみにVirtualLockは排他処理というより、Page Faultを起こさないようにするAPIです。

    まず、周りの人に話をしてみるのがよいような気がしますが、如何でしょうか。

    また、Numerical Recipesならそれをメインに扱っているForumに投稿した方が回答が早いかもしれません。

    • 回答としてマーク baku82 2010年12月1日 2:18
    • 回答としてマークされていない baku82 2010年12月1日 2:18
    • 回答としてマーク baku82 2010年12月1日 2:20
    2010年11月18日 11:48

すべての返信

  • Numerical Recipesですか?

    メモリの確保はどのように行っているのでしょうか?

    どのAPIを利用しているのでしょうか?CRTのmallocですか?

    また、”mlockで排他エラーとなる”とは具体的にどのような状況でしょうか?

    そのmlock関数は誰が用意しているのでしょうか?mlock関数は自分で移植されたのでしょうか?

     

    >エラーになってしまいます

    >いろいろ調べたところ

    これらの情報が具体的に必要かなと思います。

     

    ちなみにVirtualLockは排他処理というより、Page Faultを起こさないようにするAPIです。

    まず、周りの人に話をしてみるのがよいような気がしますが、如何でしょうか。

    また、Numerical Recipesならそれをメインに扱っているForumに投稿した方が回答が早いかもしれません。

    • 回答としてマーク baku82 2010年12月1日 2:18
    • 回答としてマークされていない baku82 2010年12月1日 2:18
    • 回答としてマーク baku82 2010年12月1日 2:20
    2010年11月18日 11:48
  • ありがとうございます。

    回答を参考に周りの人でわかりそうな人を見つけて解決いたしました。

    ありがとうございました。

    2010年12月1日 2:20