2016-04-29 3 views
-1

デバイスファンクションからアクセスするには、大きなデータファイル(1000000行と2カラム)が必要です。計算のすべてのステップで、変数の値がデバイス関数内で変化し、データファイルの特定の行の値が必要になります。そのため、すべてのステップで変数の値を制御することができないため、データファイル全体をデバイス関数で使用できるようにする必要があります。デバイスファンクションからの大きなデータファイルアクセス

以下のプログラムでは、変数の値がデバイスファンクションからホストデバイスファンクションに送信され、ホストファンクションからホストファンクション(データファイルが使用可能)に変数が送信されます。ホスト関数は配列全体から必要な値を取得します。このようにして、ある特定のステップに必要な値がデバイス関数に渡されます。しかし、このプロセスはコードのために働いていません。

私はCUDA V0.2.1221かのキーワード__host__ __device__作品かどうかわかりません。

デバイスの機能に大きなデータファイルをaccssする方法を提案してください。

コードの必要な部分にはbeowが与えられます。

__host__ 
void magnetic(R *xx, R *magfield) 
{ 
    float Bx[1000001],By[1000001]; 
    R x[3]; 
    int k; 
    FILE *fp; 
    fp = fopen("field.dat", "r"); 
    for (int i=0;i<=1000000;i++) 
    { 
    fscanf(fp, "%f%f", &Bx[i], &By[i]); 
    } 
    fclose(fp); 
    printf("%f\t%f\n",Bx[0],By[0]); 

    for(int i=0;i<3;i++){ 
    x[i]=*xx; 
    xx++; 
    } 
    //printf("%f\t%f\t%f\n",x[0],x[1],x[2]); 
    k=round((zi+x[2])/dz); 
    magfield[0]=Bx[k]; 
    magfield[1]=By[k]; 
    magfield[2]=2.; 
} 
__host__ 
void magnetic(R *xx, R *magfield); 

__host__ __device__ 
void field(R *xx, R *magfield){ 
    R x[3]; 
    for(int i=0;i<3;i++){ 
    x[i]=*xx; 
    xx++; 
    } 
magnetic(x,magfield); 
} 

__host__ __device__ 
void field(R *xx, R *magfield); 

__device__ 
void eval_rhs( R *f, R *df, R time, int istep) { 
R magfield[3],vXB[3]; 
df[0] = f[3]; 
df[1] = f[4]; 
df[2] = f[5]; 

field(&f[0], magfield); 

    crossmultiply(&f[3], magfield, vXB); 

    df[3] = Ex + vXB[0]; 
    df[4] = Ey + vXB[1]; 
    df[5] = Ez + vXB[2]; 

} 
+2

「cuda V0.2.1221」とは何ですか? – talonmies

+0

デバイスコードから大きなデータにアクセスするためのサンプルコードは、次のような回答があります。http://stackoverflow.com/questions/27282273/is-it-possible-to-access-hard-disk-directly-from-gpu/ 36899573#36899573多分あなたの質問は重複しています。 –

答えて

1

質問: デバイスの機能に大きなデータファイルをaccssする方法を提案してください。

回答: ロードホスト側のファイル、システムからデバイスメモリにバッファをコピーし、あなたのカーネルお​​よび/またはデバイスの機能で、このデバイス側のバッファを使用します。

int main() 
{ 
    FILE* file; 
    float* fileData; 

    ... // Allocate buffer here 

    ... // Open and load file here 

    float* dev_fileData; 
    cudaMalloc(/*allocate the same-sized array on device side*/); 
    cudaMemcpy(/*copy from host-side fileData to device-side*/); 

    kernel<<<blocks, threads>>>(dev_fileData); 

    system("pause"); 
    return 0; 
} 

__device__ void doSomething(float* dev_fileData) 
{ 
    // Read (and/or write, but avoid concurrent access) data here 
} 

__global__ void kernel(float* dev_fileData) 
{ 
    // Some kernel code 

    doSomething(dev_fileData); 

    // Some other kernel code 
} 
+0

提案はコードのためにうまくいきます。 –

+1

これが役に立った場合は、回答を受け入れることを検討してください。 – Taro

関連する問題