/* ----------------------------------------------------------------------- Copyright: 2010-2021, imec Vision Lab, University of Antwerp 2014-2021, CWI, Amsterdam Contact: astra@astra-toolbox.com Website: http://www.astra-toolbox.com/ This file is part of the ASTRA Toolbox. The ASTRA Toolbox is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The ASTRA Toolbox is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the ASTRA Toolbox. If not, see . ----------------------------------------------------------------------- */ /** \file astra_mex_c.cpp * * \brief Contains some basic "about" functions. */ #include #include "mexHelpFunctions.h" #include "mexInitFunctions.h" #include "astra/Globals.h" #include "astra/Features.h" #include "astra/AstraObjectManager.h" #ifdef ASTRA_CUDA #include "astra/cuda/2d/astra.h" #include "astra/cuda/2d/util.h" #include "astra/CompositeGeometryManager.h" #endif using namespace std; using namespace astra; //----------------------------------------------------------------------------------------- /** astra_mex('credits'); * * Print Credits */ void astra_mex_credits(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { mexPrintf("The ASTRA Toolbox has been developed at the University of Antwerp and CWI, Amsterdam by\n"); mexPrintf(" * Prof. dr. Joost Batenburg\n"); mexPrintf(" * Prof. dr. Jan Sijbers\n"); mexPrintf(" * Dr. Jeroen Bedorf\n"); mexPrintf(" * Dr. Folkert Bleichrodt\n"); mexPrintf(" * Dr. Andrei Dabravolski\n"); mexPrintf(" * Dr. Willem Jan Palenstijn\n"); mexPrintf(" * Dr. Daniel Pelt\n"); mexPrintf(" * Dr. Tom Roelandts\n"); mexPrintf(" * Dr. Wim van Aarle\n"); mexPrintf(" * Dr. Gert Van Gompel\n"); mexPrintf(" * Sander van der Maar, MSc.\n"); mexPrintf(" * Gert Merckx, MSc.\n"); } //----------------------------------------------------------------------------------------- /** use_cuda = astra_mex('use_cuda'); * * Is CUDA enabled? */ void astra_mex_use_cuda(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (1 <= nlhs) { plhs[0] = mxCreateDoubleScalar(astra::cudaAvailable() ? 1 : 0); } } //----------------------------------------------------------------------------------------- /** set_gpu_index = astra_mex('set_gpu_index'); * * Set active GPU */ void astra_mex_set_gpu_index(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { #ifdef ASTRA_CUDA bool usage = false; if (nrhs != 2 && nrhs != 4) { usage = true; } astra::SGPUParams params; params.memory = 0; if (!usage && nrhs >= 4) { std::string s = mexToString(prhs[2]); if (s != "memory") { usage = true; } else { params.memory = (size_t)mxGetScalar(prhs[3]); } } if (!usage && nrhs >= 2) { int n = mxGetN(prhs[1]) * mxGetM(prhs[1]); params.GPUIndices.resize(n); double* pdMatlabData = mxGetPr(prhs[1]); for (int i = 0; i < n; ++i) params.GPUIndices[i] = (int)pdMatlabData[i]; astra::CCompositeGeometryManager::setGlobalGPUParams(params); // Set first GPU if (n >= 1) { bool ret = astraCUDA::setGPUIndex((int)pdMatlabData[0]); if (!ret) mexPrintf("Failed to set GPU %d\n", (int)pdMatlabData[0]); } } if (usage) { mexPrintf("Usage: astra_mex('set_gpu_index', index/indices [, 'memory', memory])"); } #endif } //----------------------------------------------------------------------------------------- /** get_gpu_info = astra_mex('get_gpu_info'); * * Get GPU info */ void astra_mex_get_gpu_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { #ifdef ASTRA_CUDA int device = -1; if (nrhs >= 2 && mxIsDouble(prhs[1]) && mxGetN(prhs[1]) * mxGetM(prhs[1]) == 1 ) { device = (int)mxGetScalar(prhs[1]); } mexPrintf("%s\n", astraCUDA::getCudaDeviceString(device).c_str()); #endif } //----------------------------------------------------------------------------------------- /** has_feature = astra_mex('has_feature'); * * Check a feature flag. See include/astra/Features.h. */ void astra_mex_has_feature(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (2 > nrhs) { mexErrMsgTxt("Usage: astra_mex('has_feature', feature);\n"); return; } string sMode = mexToString(prhs[0]); bool ret = false; // NB: When adding features here, also document them centrally in // include/astra/Features.h if (sMode == "mex_link") { #ifdef USE_MATLAB_UNDOCUMENTED ret = true; #else ret = false; #endif } else { ret = astra::hasFeature(sMode); } plhs[0] = mxCreateDoubleScalar(ret ? 1 : 0); } //----------------------------------------------------------------------------------------- /** version_number = astra_mex('version'); * * Fetch the version number of the toolbox. */ void astra_mex_version(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (1 <= nlhs) { plhs[0] = mxCreateDoubleScalar(astra::getVersion()); } else { mexPrintf("ASTRA Toolbox version %s\n", astra::getVersionString()); } } //----------------------------------------------------------------------------------------- void astra_mex_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (nrhs < 2) { mexErrMsgTxt("Usage: astra_mex('info', index/indices);\n"); return; } for (int i = 1; i < nrhs; i++) { int iDataID = (int)(mxGetScalar(prhs[i])); CAstraObjectManagerBase *ptr; ptr = CAstraIndexManager::getSingleton().get(iDataID); if (ptr) { mexPrintf("%s\t%s\n", ptr->getType().c_str(), ptr->getInfo(iDataID).c_str()); } } } //----------------------------------------------------------------------------------------- void astra_mex_delete(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { if (nrhs < 2) { mexErrMsgTxt("Usage: astra_mex('delete', index/indices);\n"); return; } for (int i = 1; i < nrhs; i++) { int iDataID = (int)(mxGetScalar(prhs[i])); CAstraObjectManagerBase *ptr; ptr = CAstraIndexManager::getSingleton().get(iDataID); if (ptr) ptr->remove(iDataID); } } //----------------------------------------------------------------------------------------- static void printHelp() { mexPrintf("Please specify a mode of operation.\n"); mexPrintf(" Valid modes: version, use_cuda, credits, set_gpu_index, has_feature, info, delete\n"); } //----------------------------------------------------------------------------------------- /** * ... = astra_mex(type,...); */ void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { // INPUT0: Mode string sMode = ""; if (1 <= nrhs) { sMode = mexToString(prhs[0]); } else { printHelp(); return; } initASTRAMex(); // SWITCH (MODE) if (sMode == std::string("version")) { astra_mex_version(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("use_cuda")) { astra_mex_use_cuda(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("credits")) { astra_mex_credits(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("set_gpu_index")) { astra_mex_set_gpu_index(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("get_gpu_info")) { astra_mex_get_gpu_info(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("has_feature")) { astra_mex_has_feature(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("info")) { astra_mex_info(nlhs, plhs, nrhs, prhs); } else if (sMode == std::string("delete")) { astra_mex_delete(nlhs, plhs, nrhs, prhs); } else { printHelp(); } return; }