Files
2026-08-07 15:56:42 +09:00

113 lines
4.6 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "mex.h"
#include "gpu/mxGPUArray.h"
#include "interp3_gpu.hpp"
// interp3_gpu.m - fast texture based GPU based interpolation method for 3D deformation
//
// RECOMPILE: mexcuda -output interp3_gpu_mex interp3_gpu_ker.cu interp3_gpu_mex.cpp
//
// %*-----------------------------------------------------------------------*
// %|                                                                       |
// %|  Except where otherwise noted, this work is licensed under a          |
// %|  Creative Commons Attribution-NonCommercial-ShareAlike 4.0            |
// %|  International (CC BY-NC-SA 4.0) license.                             |
// %|                                                                       |
// %|  Copyright (c) 2018 by Paul Scherrer Institute (http://www.psi.ch)    |
// %|                                                                       |
// %|      Author: CXS group, PSI  |
// %*-----------------------------------------------------------------------*
// % You may use this code with the following provisions:
// %
// % If the code is fully or partially redistributed, or rewritten in another
// % computing language this notice should be included in the redistribution.
// %
// % If this code, or subfunctions or parts of it, is used for research in a
// % publication or if it is fully or partially rewritten for another
// % computing language the authors and institution should be acknowledged
// % in written form in the publication: “Data processing was carried out
// % using the “cSAXS matlab package” developed by the CXS group,
// % Paul Scherrer Institut, Switzerland.”
// % Variations on the latter text can be incorporated upon discussion with
// % the CXS group if needed to more specifically reflect the use of the package
// % for the published work.
// %
// % A publication that focuses on describing features, or parameters, that
// % are already existing in the code should be first discussed with the
// % authors.
// %
// % This code and subroutines are part of a continuous development, they
// % are provided “as they are” without guarantees or liability on part
// % of PSI or the authors. It is the user responsibility to ensure its
// % proper use and the correctness of the results.
/**
* MEX gateway
*/
void mexFunction(int nlhs , mxArray *plhs[],
int nrhs, mxArray const *prhs[])
{
char const * const errId = "parallel:gpu:interp3_gpu:InvalidInput";
char const * const errMsg = "Invalid input to MEX file.";
// Initialize the MathWorks GPU API.
mxInitGPU();
if (nrhs!=4) {
mexPrintf("Wrong number of inputs\n");
mexErrMsgIdAndTxt(errId, errMsg);
}
const mxGPUArray * m_Img_orig = mxGPUCreateFromMxArray(prhs[0]);
if ((mxGPUGetClassID(m_Img_orig) != mxSINGLE_CLASS)) {
mexPrintf("wrong input m_Img_orig\n");
mexErrMsgIdAndTxt(errId, errMsg);
}
const float * p_Img_orig = (const float *)mxGPUGetDataReadOnly(m_Img_orig);
const mxGPUArray * m_X = mxGPUCreateFromMxArray(prhs[1]);
const mxGPUArray * m_Y = mxGPUCreateFromMxArray(prhs[2]);
const mxGPUArray * m_Z = mxGPUCreateFromMxArray(prhs[3]);
if ((mxGPUGetClassID(m_X) != mxSINGLE_CLASS) |
(mxGPUGetClassID(m_Y) != mxSINGLE_CLASS) |
(mxGPUGetClassID(m_Z) != mxSINGLE_CLASS)) {
mexPrintf("wrong input X,Y,Z\n");
mexErrMsgIdAndTxt(errId, errMsg);
}
mwSize const * dimensions = mxGPUGetDimensions(m_Img_orig);
mwSize Ndim = mxGPUGetNumberOfDimensions(m_Img_orig);
int M = (int)dimensions[0];
int N = (int)dimensions[1];
int O = Ndim > 2 ? (int)dimensions[2] : 1;
mxGPUArray * m_Img_out = mxGPUCreateGPUArray(Ndim,
dimensions,
mxSINGLE_CLASS,
mxREAL,
MX_GPU_INITIALIZE_VALUES);
float * p_Img_out = (float *)mxGPUGetData(m_Img_out);
checkLastError("Before kernel run");
// mexcuda -output interp3_gpu_mex interp3_gpu_ker.cu interp3_gpu_mex.cpp
interp3_init( p_Img_out,m_Img_orig, m_X, m_Y, m_Z, M, N, O);
checkLastError("Before after run");
plhs[0] = mxGPUCreateMxArrayOnGPU(m_Img_out);
mxGPUDestroyGPUArray(m_Img_out);
mxGPUDestroyGPUArray(m_Img_orig);
mxGPUDestroyGPUArray(m_X);
mxGPUDestroyGPUArray(m_Y);
mxGPUDestroyGPUArray(m_Z);
}