2011-07-31 11 views
0

にテクスチャメモリバインディングIサイズのGPU(p7P_NXSTATES)Xようなので(p7P_NXTRANS)上のフロートポイントマトリックス作成:、一度GPUにコピーGPU割り当てマトリックス

// Special Transitions 
// Host pointer to array of device pointers 
float **tmp_xsc = (float**)(malloc(p7P_NXSTATES * sizeof(float*))); 
// For every alphabet in scoring profile... 
for(i = 0; i < p7P_NXSTATES; i++) 
{ 
    // Allocate memory for device for every alphabet letter in protein sequence 
    cudaMalloc((void**)&(tmp_xsc[i]), p7P_NXTRANS * sizeof(float)); 
    // Copy over arrays 
    cudaMemcpy(tmp_xsc[i], gm.xsc[i], p7P_NXTRANS * sizeof(float), cudaMemcpyHostToDevice); 
} 
// Copy device pointers to array of device pointers on GPU (matrix) 
float **dev_xsc; 
cudaMalloc((void***)&dev_xsc, p7P_NXSTATES * sizeof(float*)); 
cudaMemcpy(dev_xsc, tmp_xsc, p7P_NXSTATES * sizeof(float*), cudaMemcpyHostToDevice); 

このメモリを、あります変更されることはなく、読まれるだけです。したがって、私はこれをテクスチャメモリにバインドすることに決めました。問題は、2Dテクスチャメモリで作業する場合、メモリにバインドされるメモリは実際には、オフセットを使って行列として機能する単なる配列であるということです。

は、私は、このような

tex2D(texXSC、X、Y)としてそれにアクセスするために、この2Dメモリを結合することcudaBindTexture2D()とcudaCreateChannelDesc()を使用する必要が知ってい

- しかし、私はちょうどその方法がわかりません。何か案は?

答えて

1

簡単な答えは、ポインタの配列をテクスチャにバインドできないことです。 CUDA配列を作成し、線形ソースメモリからデータをコピーするか、またはテクスチャに直接バインドされたピッチ付き線形メモリを使用することができます。しかし、ポインタの配列は動作しません。

+0

ダーン、よく私はそれも動作すると思います。 1Dテクスチャメモリの場合と同じように、1つのマクロの後ろに隠すことでコードを単純化できます。私は上記のコードで述べたこの関数の使い方の例を得ることができます。 – sj755

+0

私の答えを繰り返すには:あなたのコードはデバイスポインタの配列を割り当てており、それらはテクスチャ操作のどんな種類でも使用できないので、私はあなたのコードで言及したものを使用することはできません。 – talonmies