0

取り組んでいるプログラムがあります。私はCUDAとCを初めて使用するので、私にとっては本当にでこぼこした乗り物でした。構造体をデバイスにコピーしようとしています。次に、構造体をデバイスにコピーして、構造体をホストに戻そうとしています。以下はコードです:

typedef struct {
    int row;
    int col;
    float *arr;
    int numElements;
} Matrix;

Matrix *RMatrix = //definition here

Matrix *d_RMatrix;

    copyMatrix(d_RMatrix, RMatrix, hostToDevice);

    Matrix *check = createMatrix(0, 0, NULL, 0);

    copyMatrix(check, d_RMatrix, deviceToHost);

との定義copyMatrix

void copyMatrix (Matrix *copyTo, Matrix *copyFrom, Copy_type type) 
{

    if(type == hostToDevice) {

        // create temporary host matrix and array
        Matrix *copyFrom_h = createMatrix(copyFrom->row, copyFrom->col, NULL, copyFrom->numElements);

        // allocate device memory, pointing to array in host. Copy array to device memory
        cudaMalloc((void**) &copyFrom_h->arr, sizeof(float) * copyFrom_h->numElements);
        cudaMemcpy(copyFrom_h->arr, copyFrom->arr, sizeof(float) * copyFrom_h->numElements, cudaMemcpyHostToDevice);

        // copy the temporary memory to device
        cudaMalloc((void**) &copyTo, sizeof(Matrix));
        cudaMemcpy(copyTo, copyFrom_h, sizeof(Matrix), cudaMemcpyHostToDevice);

        copyFrom_h = NULL;
        free(copyFrom_h);

    }

    else if(type == deviceToHost) {

        cudaMemcpy(copyTo, copyFrom, sizeof(Matrix), cudaMemcpyDeviceToHost);

        // allocate space for array in the copy to matrix
        copyTo->arr = makeArray(copyTo->col, copyTo->row);
        cudaMemcpy(copyTo->arr, copyFrom->arr, sizeof(float) * copyTo->numElements, cudaMemcpyDeviceToHost);

    }
}

エラーは、cudaMemcpyへの最初の呼び出しで0x3(d_RMatrixの値)で無効なメモリアクセスを示し、2番目にsegfaultが発生します。

ここで足りないものはありますか?ご協力いただきありがとうございます :)

4

1 に答える 1

1

Cでは、ポインタはオブジェクト(この場合)を指すエンティティです。ポインタを作成しても、オブジェクトは作成されず、オブジェクトにスペースが割り当てられません。

ポインタを作成しましたMatrix *d_RMatrix;が、有効なオブジェクトを指していません。偶然にデータをメモリ内のランダムな場所に実際にコピーすることができたため、クラッシュしたのは幸運でした。

Matrix TheMatrix();
Matrix *PointerToTheMatrix = &TheMatrix;

または

Matrix *PointerToTheMatrix = createMatrix(...);//remember you will have to delete it eventually!

関数パラメーターは一方向です。内部関数に何かを割り当てるとcopyTo、変更は関数の外部には表示されません。

/編集:私は考えを持っています:

Matrix* CreateMatrixInDevice(Matrix* copyFrom)
{
    Matrix* copyTo = NULL;
    cudaMalloc((void**) &copyTo, sizeof(Matrix));//create outer struct
    cudaMemcpy(copyTo, copyFrom, sizeof(Matrix), cudaMemcpyHostToDevice);//copy data from outer struct
    //the arr element in the device is now INVALID (pointing to host)

    cudaMalloc((void**) &copyTo->arr, sizeof(float) * copyFrom->numElements);//create inner array
    cudaMemcpy(copyTo->arr, copyFrom->arr, sizeof(float) * copyFrom->numElements, cudaMemcpyHostToDevice);//copy matrix data

    return copyTo;
}
于 2013-03-21T19:21:41.480 に答える