如何处理CUDA中MEX网关功能中的复杂输入?
4次浏览(最近30天)
显示旧的注释
你好,
我试着写一个MEX网关函数来添加两个复向量。我用推力来处理。然而,当我想在Matlab中编译代码时,我得到了这个错误:
错误使用墨西哥人
C: /用户/ moein.m /文件/ c++ / ImageReconstruction_VisualStudioCode Project7_TUI_CUDA3 / TUI_CUDA / TUI_CUDA / test2_GPUArray_Complex.cu (55):
错误:标识符“mxGetComplexDoubles”是未定义的
1错误的编译中检测到
“C: /用户/ moein.m /文件/ c++ / ImageReconstruction_VisualStudioCode / Project7_TUI_CUDA3 / TUI_CUDA / TUI_CUDA / test2_GPUArray_Complex.cu”.
学校网站警告:'compute_35',“compute_37”,“compute_50”,“sm_35”,“sm_37”而且“sm_50”架构
是弃用,使用-Wno-deprecated-gpu-targets来抑制
警告)。
test2_GPUArray_Complex.cu
错误在美可达(第168行)
[varargout{1:nargout}] = mex(mexArguments{:});
错误test2_GPUArray_matlabRunner(第4行)
mexcuda (“v”,“test2_GPUArray_Complex.cu”,“NVCCFLAGS = -gencode =拱= compute_50、代码= sm_50 -Xptxas
-dlcm = cg ');
这是我的代码:
#包括< cuda_runtime.h >
#包括“device_launch_parameters.h”
#包括< stdio . h >
#包括“cuda.h”
#包括< iostream >
#包括< mex.h >
#包括“gpu / mxGPUArray.h”
//#包括< cuComplex.h >
//#包括< cublas_v2.h >
#包括<推力/ complex.h >
#包括“matrix.h”
#定义gpuErrchk(ans) {gpuAssert((ans),__FILE__,__LINE__);}
内联void gpuAssert(cudaError_t code, const char* file, int line, bool abort = true)
{
如果(code != cudassuccess)
{
流(stderr,GPUassert: %s %s %d\n, cudaGetErrorString(代码),文件,行);
如果(中止)退出(代码);
}
}
类型定义推力:复杂的<飘> fcomp;
__global__无效add(fcomp * Device_DataRes, fcomp * Device_Data1, fcomp * Device_Data2, int N) {
intTID = threadIdx。y * blockDim。x + threadaddx .x;
intBlockOFFset = blockDim。x * blockDim。y * blockIdx.x;
intGID_RowBased = BlockOFFset + TID;
如果(GID_RowBased < N) {
Device_DataRes[GID_RowBased] = Device_Data1[GID_RowBased] + Device_Data2[GID_RowBased];
}
}
无效mexFunction(int nlhs, mxArray* plhs[],
intnrhs,常量mxArray* prhs[]) {
intN = 1000;
intArrayByteSize = sizeof(fcomp) * N;
fcomp * Data1;
fcomp * Device_Data1;
fcomp * Data2;
fcomp * Device_Data2;
fcomp *塔尔;
fcomp * Device_DataRes;
Data1 = static_cast(mxGetComplexDoubles(prhs[0]));
//Data1 = (fcomp*)(mxGetComplexDoubles(prhs[0]));
gpuErrchk (cudaMalloc ((void * *) &Device_Data1 ArrayByteSize));
gpuErrchk(cudaMemcpy(Device_Data1, Data1, ArrayByteSize, cudaMemcpyHostToDevice));
Data2 = static_cast(mxGetComplexDoubles(prhs[1]));
gpuErrchk (cudaMalloc ((void * *) &Device_Data2 ArrayByteSize));
gpuErrchk(cudaMemcpy(Device_Data2, Data2, ArrayByteSize, cudaMemcpyHostToDevice));
plhs[0] = mxCreateNumericMatrix(N, 1, mxSINGLE_CLASS, mxCOMPLEX);
DataRes = static_cast (mxGetData(plhs[0]));
gpuErrchk (cudaMalloc ((void * *) &Device_DataRes ArrayByteSize));
dim3块(1024);
intGridX = (N / block。X + 1);
dim3网格(GridX)/ / SystemSetup。NumberOfTransmitter
添加< < <网格、块>> > (Device_DataRes, Device_Data1, Device_Data2, N);
gpuErrchk(cudaMemcpy(DataRes, Device_DataRes, ArrayByteSize, cudaMemcpyDeviceToHost));
cudaFree (Device_Data1);
cudaFree (Device_Data2);
cudaFree (Device_DataRes);
}
你能告诉我这里出了什么问题吗?似乎“mxGetComplexDoubles”正在制造问题。
问候,
Moein。
0评论
接受的答案
Edric埃利斯
2021年6月18日
首先,根据
交错复杂数据的文档页
,则需要添加命令行标志
-R2018a
使用
mxGetComplexDoubles
.但实际上我认为,考虑到你正在选择
推力:复杂的<飘>
,你实际上应该使用
mxGetComplexSingles
.
你不能直接在
mxComplexSingle *
返回的
mxGetComplexSingles
而且
推力:复杂的<飘>
,但它仍然应该工作,以执行
memcpy
操作。换句话说,你需要这样做:
mxComplexSingle * Data1 = mxGetComplexSingles(prhs[0]);
推力::complex * Device_Data1;
gpuErrchk (cudaMalloc ((void * *) &Device_Data1 ArrayByteSize));
gpuErrchk(cudaMemcpy(Device_Data1, Data1, ArrayByteSize, cudaMemcpyHostToDevice));