0

GPUから3D配列を取得する方法を理解しようとして問題が発生しています。ホストコードの3d配列にメモリを割り当て、配列が入力されるカーネルを呼び出してから、ホストコードの3D配列を取得して、mexFunction(ホストコード)の戻り変数にします。

私はそれを何度か試みました、これが私の最新のコードです。結果はすべて「0」であり、「7」である必要があります。誰かが私がどこで間違っているのか教えてもらえますか?それは3Dパラメータと関係があるかもしれません、私はその部分を完全に理解しているとは思いません。

Simulate3DArrays.cpp

/* Device code */
__global__ void simulate3DArrays(cudaPitchedPtr devPitchedPtr, 
                             int width, 
                             int height, 
                             int depth) 
{
int threadId;
threadId = (blockIdx.x * blockDim.x) + threadIdx.x;

size_t pitch = devPitchedPtr.pitch; 

for (int widthIndex = 0; widthIndex < width; widthIndex++) {
    for (int heightIndex = 0; heightIndex < height; heightIndex++) {

        *((double*)(((char*)devPitchedPtr.ptr + threadId * pitch * height) + heightIndex * pitch) + widthIndex) = 7.0;

    }
}    
}

mexFunction.cu

/* Host code */
#include <stdio.h>
#include "mex.h"

/* Kernel function */
#include "simulate3DArrays.cpp"

/* Define some constants. */
#define width  5
#define height 9
#define depth  6

void displayMemoryAvailability(mxArray **MatlabMemory);

void mexFunction(int        nlhs,
             mxArray    *plhs[],
             int        nrhs,
             mxArray    *prhs[])
{

double *output;
mwSize ndim3 = 3;
mwSize dims3[] = {height, width, depth};

plhs[0] = mxCreateNumericArray(ndim3, dims3, mxDOUBLE_CLASS, mxREAL);
output = mxGetPr(plhs[0]);

cudaExtent extent = make_cudaExtent(width * sizeof(double), height, depth);
cudaPitchedPtr devicePointer;
cudaMalloc3D(&devicePointer, extent);


simulate3DArrays<<<1,depth>>>(devicePointer, width, height, depth);

cudaMemcpy3DParms deviceOuput = { 0 };
deviceOuput.srcPtr.ptr = devicePointer.ptr;
deviceOuput.srcPtr.pitch = devicePointer.pitch;
deviceOuput.srcPtr.xsize = width;
deviceOuput.srcPtr.ysize = height;

deviceOuput.dstPtr.ptr = output;
deviceOuput.dstPtr.pitch = devicePointer.pitch;
deviceOuput.dstPtr.xsize = width;
deviceOuput.dstPtr.ysize = height;

deviceOuput.kind = cudaMemcpyDeviceToHost;
/* copy 3d array back to 'ouput' */
cudaMemcpy3D(&deviceOuput);


return;
} /* End Mexfunction */
4

1 に答える 1

1

cudaMemcpy3D基本的な問題は、APIへの転送のサイズを定義するゼロ以外のエクステントが含まれていないため、ゼロバイトをコピーするように指示していることであるように見えます。

転送はおそらく次のように簡単です。

cudaMemcpy3DParms deviceOuput = { 0 };
deviceOuput.srcPtr = devicePointer;
deviceOuput.dstPtr.ptr = output;
deviceOuput.extent = extent;

cudaMemcpy3D(&deviceOuput);

使用しているMEXインターフェイスが正しいかどうかについてコメントすることはできませんが、カーネルは表面的には正しいように見え、コンパイラにアクセスしてMatlabでコードを実行しようとしない限り、明らかに間違っているものはありません。 。

于 2012-08-09T12:12:10.987 に答える