2012-02-17 28 views
-2

このコードは、CUDAの行列乗算を並列処理するためにx colとx rowsを取り込むプログラムからのものです。サンプルサイズが大きければ大きいほど良い。数値が大きいとsegフォールトが発生する

x個の乱数を自動的に生成する機能があります。

答えは簡単ですが、私はちょうどその理由を正確に知りたいと思っていました。しかし、配列内の625000000要素を使って実行すると、エラーが発生します。私はそれがintのためにメモリ内に許されているサイズを超えたためだと思う。

数値が大きいほどintの代わりに使用するデータ型は何ですか? これは、データが割り当てられてから、関数に渡される方法です。

a.elements = (float*) malloc(mem_size_A); 

合格
int mem_size_A = sizeof(float) * size_A; //for the example let size_A be 625,000,000 

:randomInitが何をしているか

randomInit(a.elements, a.rowSize,a.colSize, oRowA, oColA); 

が、私は2×2に入ると言っているが、それはかかるので、私は16の倍数にそれを水増ししています2x2と16x16の0にマトリックスを埋め込み、2x2はまだそこにあります。

void randomInit(float* data, int newRowSize,int newColSize, int oldRowSize, int oldColSize) 
{ 
    printf("Initializing random function. The new sized row is %d\n", newRowSize); 
    for (int i = 0; i < newRowSize; i++)//go per row of new sized row. 
    { 
     for(int j=0;j<newColSize;j++) 
     { 
      printf("This loop\n"); 
      if(i<oldRowSize&&j<oldColSize) 
      { 
       data[newRowSize*i+j]=rand()/(float)RAND_MAX;//brandom(); 
      } 
      else 
       data[newRowSize*i+j]=0; 
     } 
    } 
} 

私はループ内のprintfで実行しました。

Creating the random numbers now 
Initializing random function. The new sized row is 25000 
This loop 
Segmentation fault 
+0

「データ」はどのように定義されていますか? – cnicutar

+0

データ配列をどこでmallocしますか?おそらく小さすぎる –

+2

この関数を呼び出すコードを表示してください。実際には、あなたのsegフォルトを示す小さな、完全なプログラムを作り、あなたの質問にそれを貼り付けてください。 http://sscce.org/を参照してください。 –

答えて

0

私はあなたがdataに割り当てられた値を超えてつもりだと思う:これは私が得る結果です。あなたがnewrowsizeが大きすぎる場合、あなたは割り当てられていないメモリにアクセスしています。

覚えておいてください、dataは無限大ではありません。

-2

実際の問題は、問題が実際に配列アクセスに使用されている整数サイズの場合、それを修正できないことです。私はおそらくあなたの記憶には膨大な数のデータを保存するのに十分なスペースがないと思います。

これを拡張したい場合は、C++の場合はカスタム構造またはクラスを定義するだけです。しかし、あなたはO(1)時のアクセスの複雑さを緩和します。

1

dataのメモリ割り当てに問題がある可能性があります。

幸いにも、大規模な乱数のコレクションを格納する必要はほとんどありません。代わりに格納する

srand(n); 
value = rand()/(float)RAND_MAX; 

は、あなたが特定の数を必要とするとき、あなたは同じ値を毎回取得します:

data[n]=rand()/(float)RAND_MAX 

nのいくつかの巨大なコレクションのために、あなたが実行することができますまるでそれらがすべて前もって計算されたかのように。

+0

私はあなたの説明に迷っています。後で別の関数に渡す必要があります。私が望む場所にそれを播種すると、その値が配列のその場所にあることを意味しますか? – Dan

+0

@ダン、おそらくあなたはなぜあなたが** 5億のランダムなビットを必要とするかについての説明をあなたの質問を修正することができます**。それは私の経験では必要とすることは珍しいことです。間違った問題を解決しようとしているかもしれません。 –

+0

このビットのコードは、x colとx rowsを取り入れてCUDAの行列乗算を並列処理するプログラムです。サンプルサイズが大きければ大きいほど良い。 – Dan

関連する問題