Memory 在MexGateway代码中,我应该如何处理由Matlab gpuArray生成的设备变量?

Memory 在MexGateway代码中,我应该如何处理由Matlab gpuArray生成的设备变量?,memory,cuda,mex,Memory,Cuda,Mex,() 我试图通过Matlab gpuArray commnad在GPU中复制一个变量,并将其传递给一个MEXFunction(由下面提供的网关代码生成)。我有两个MEXFunction的输入(称为Device_MediumX,Data)。我想在for循环中使用这个函数,并且只更新每个循环中的数据。这就是为什么我需要将设备_MediumX发送到GPU一次(两者都是巨大的) 下面是代码: #include <cuda_runtime.h> #include "device_la

()

我试图通过Matlab gpuArray commnad在GPU中复制一个变量,并将其传递给一个MEXFunction(由下面提供的网关代码生成)。我有两个MEXFunction的输入(称为Device_MediumX,Data)。我想在for循环中使用这个函数,并且只更新每个循环中的数据。这就是为什么我需要将设备_MediumX发送到GPU一次(两者都是巨大的)

下面是代码:

#include <cuda_runtime.h>
#include "device_launch_parameters.h"
 #include <stdio.h>
 #include "cuda.h"
#include <iostream>
#include <mex.h>
#include "MexFunctions.cuh"
__global__ void add(int* Device_Data, int* 
Device_MediumX, int N) {
int TID = threadIdx.y * blockDim.x + threadIdx.x;
if (TID < N) {
    for (int i = 0; i < N; i++) {
        Device_Data[i] = Device_Data[i] + 
  Device_MediumX[i];
    }
   }
 }

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

int N = 128;
int* Device_MediumX;
int* Data;
int* Data_New;

Device_MediumX = (int*)mxGetPr(prhs[0]);
Data = (int*)mxGetPr(prhs[1]);

plhs[0] = mxCreateNumericMatrix(N, 1, mxINT32_CLASS, 
mxREAL);
Data_New = (int*)mxGetData(plhs[0]);


int ArrayByteSize = sizeof(int) * N;

int* Device_Data; // device pointer to the X 
coordinates of the medium
gpuErrchk(cudaMalloc((int**)&Device_Data, 
ArrayByteSize));
gpuErrchk(cudaMemcpy(Device_Data, Data, 
ArrayByteSize, cudaMemcpyHostToDevice));

dim3 block(N, 1);
dim3 grid(1);//SystemSetup.NumberOfTransmitter
add << <grid, block >> > (Device_Data, 
Device_MediumX, N);

(cudaMemcpy(Data_New, Device_Data, ArrayByteSize, 
cudaMemcpyDeviceToHost));


cudaDeviceReset();

 }
当我运行这个程序时,我得到了128个零的新数据。第二次运行最后一行会使Matlab崩溃。 你知道我的代码有什么问题吗

莫因

GPU_device=gpuDevice();
Data=11:1:138;
Data=transpose(int32(Data));
MediumX=1:1:128;
MediumX=transpose(int32(MediumX));
Device_MediumX=gpuArray(MediumX); 
Data_New=test2_GPUArray(Device_MediumX, Data);