# 如何修改MCX原版code > [time=Sat, Jan 29, 2022 11:11 PM] > [name=dicky1031] > [TOC] ## 1. 初始設定 [原始程式碼連結](https://github.com/fangq/mcx) 我修改的部分從branch-master clone而來 修改資料夾 MCX/src (原版MCX C code都會在這裏面) ## 2. 原始code功能說明 判斷哪個detector偵測到: mcx_core.cu : finddetector 使用出光光子與detector XYZ距離的平方合,看是否在detector半徑以內 mcx_core.cu : mcx_main_loop 是MC的主要loop 他真的是在每個while loop裡面一個一個voxel移動 random出一個unitless PL後 走一個voxel花的距離要乘上mus才是他花掉的PL 不過他裡面有計算mua衰減的code mcx_core.cu : line 1255~1259 finddetector會被savedetphoton呼叫到,用來決定要儲存在哪個detector 而savedetphoton會在每次launchnewphoton時被呼叫到,把上一顆光子的資訊存起來 launchnewphoton則會在mcx_main_loop裡面的開始新光子、光子跑出組織外、輪盤玩輸之後被呼叫到 看起來頗合理 因此應該不會有上次懷疑的,detector太大(超出一個voxel)導致收到的光子不對的狀況 mcx_main_loop之中 launchnewphoton在一開始、玩輪盤,或是time window超過、光子從non-zero voxel跑到zero voxel時會被呼叫 launchnewphoton: 結束目前的光子,並且開始新的光子 如果mediaid(the medium index at the voxel at launch)==0且isdet(前一顆光子打到了detector)的話,裡面會呼叫到savedetphoton,才會把偵測到個光子存起來 transmit會在檢查光子是否跑到zero voxel前被呼叫,而transmit會改變方向,所以輸出的光子方向應該是已經跑到外面的方向 ## 3. Make mex ### 3.1 編譯mex檔案 mex為matlab執行C語法的執行檔案,所以當修改完原始版C語言的程式碼後,需要再將其編譯成matlab可以執行的mex檔案 具體使用方式: 打開終端機(terminal) ``` cd ~/mcx-master/src cmake ~/mcx-master/src make ``` 之後如果都沒報錯,編譯好的mex檔案將會在mcx-master/bin裡面 --- ### 3.2 如果遇到錯誤的解決方案 #### 3.2.1 GPU環境不相容 ``` nvcc fatal : Value 'sm_30' is not defined for option 'gpu-architecture' ``` 如果看到此錯誤(注意錯誤可能為sm_**,**為任意數字代表不同版本),代表gpu環境編譯時發生不相容的情況,此時請點[此連結](https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/)查看本機端電腦的gpu規格。 --- ex:假如GPU為RTX2080,則表示此架構為Turing (CUDA 10 and later)適用sm_75版本。 因此需要將~/mcx-master/src這個路徑下的cmakelist.txt做修改。 ``` # NVCC Options set( CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}; -g -lineinfo -Xcompiler -Wall -Xcompiler -fopenmp -O3 -arch=sm_30 -DMCX_TARGET_NAME="fermi MCX" -DUSE_ATOMIC -use_fast_math -DSAVE_DETECTORS -Xcompiler -fPIC ) ``` 將上述程式碼中的 sm_30 修改為 sm_75, -DMCX_TARGET_NAME="fermi MCX" --> -DMCX_TARGET_NAME="Turing MCX" #### 3.2.2 ZLIB錯誤 ``` Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) ``` 如果看到上述錯誤則代表需安裝ZLIB,執行以下程式碼即可 ``` sudo apt-get install zlib1g-dev ``` Config structure 在 mcx_utils.h 259行 mcx_run_simulation 在 mcx_core.cu 2236行 mcxlab.cpp 257行 launchnewphoton 在 mcx_core.cu 1026行 #ifndef#define#endif的用法(整理) https://huenlil.pixnet.net/blog/post/24339151 ``` __device__ inline uint finddetector(MCXpos *p0){ uint i; for(i=gcfg->maxmedia+1;i<gcfg->maxmedia+gcfg->detnum+1;i++){ if((gproperty[i].x-p0->x)*(gproperty[i].x-p0->x)+ (gproperty[i].y-p0->y)*(gproperty[i].y-p0->y)+ (gproperty[i].z-p0->z)*(gproperty[i].z-p0->z) < gproperty[i].w*gproperty[i].w){ return i-gcfg->maxmedia; } } return 0; } ``` 在 core.cu 的2764行 /** Copy param to the constant memory variable gcfg */ 把 cfg的data複製到 gcfg(在GPU上) ``` __host__ ​cudaError_t cudaMemcpyToSymbol ( const void* symbol, const void* src, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyHostToDevice ) Copies data to the given symbol on the device. Parameters symbol - Device symbol address src - Source memory address count - Size in bytes to copy offset - Offset from start of symbol in bytes kind - Type of transfer ``` 2348行 ``` MCXParam param={cfg->steps,minstep,0,0,cfg->tend,R_C0*cfg->unitinmm, (uint)cfg->issave2pt,(uint)cfg->isreflect,(uint)cfg->isrefint,(uint)cfg->issavedet,1.f/cfg->tstep, p0,c0,s0,maxidx,uint4(0,0,0,0),cp0,cp1,uint2(0,0),cfg->minenergy, cfg->sradius*cfg->sradius,minstep*R_C0*cfg->unitinmm,cfg->srctype, cfg->srcparam1,cfg->srcparam2,cfg->voidtime,cfg->maxdetphoton, cfg->medianum-1,cfg->detnum,cfg->polmedianum,cfg->maxgate,0,0,ABS(cfg->sradius+2.f)<EPS /*isatomic*/, (uint)cfg->maxvoidstep,cfg->issaveseed>0,(uint)cfg->issaveref,cfg->isspecular>0, cfg->maxdetphoton*hostdetreclen,cfg->seed,(uint)cfg->outputtype,0,0,cfg->faststep, cfg->debuglevel,cfg->savedetflag,hostdetreclen,partialdata,w0offset,cfg->mediabyte, (uint)cfg->maxjumpdebug,cfg->gscatter,is2d,cfg->replaydet,cfg->srcnum,cfg->nphase,cfg->omega}; ``` param initial時沒有宣告bc 之後才宣告bc如下 2677行 ``` memcpy(&(param.bc),cfg->bc,12); ``` *** 開始修改 在MCX_utils.h的259行 Config{}增加 float detreflect之屬性; matlab structure to cJson https://github.com/fangq/mcx/tree/master/src/cjson mcx_loadjson