如何处理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。

接受的答案

Edric埃利斯
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));
3评论
Edric埃利斯
Edric埃利斯 2021年6月21日
看起来不像 atomicAdd 这是你想要的-我想这是标量值。在本例中,我只返回 gpuArray 数据返回到MATLAB并使用内置的重载 + gpuArray

登录评论。

更多答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!