《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 881|回复: 3
收起左侧

[提问] 求帮忙 MATLAB+mexfunction 实现不了功能

[复制链接]
发表于 2015-4-2 17:08:09 | 显示全部楼层 |阅读模式
/*square_c.cu*/
#include "mex.h"
#include "cuda_runtime.h"
#include <stdio.h>
#include "cuda.h"
#include <stdlib.h>
__global__ void square_elements(double* in1[274][346],double* in2[274][346],double* in3[274][346], double* out[274][346],int* seed,int* threshold)   //设置输入2个变量     矩阵大小M*N   seed threshold
{
        int g,h; // ////////  
  int t=0;
  //int idx=blockIdx.x*blockDim.x+threadIdx.x;
  //int idy=blockIdx.y*blockDim.y+threadIdx.y;            //引入 y方向
  for(g=0;g<274;g++)
  {
          for(h=0;h<346;h++)
          {  
                  if(in1[g][h] !=0 )                              ///Y
          {
       in2[g][h] = in1[g][h];
                  }                                          ///Z

int count=1;
int i,j,u,v;                                ///
while(count>0)
{
int s=0;
count = 0;
for(i=0;i<274;i++)
{
        for(j=0;j<346;j++)
{
        if(in2[i][j]!=0)
        {
                if((i>1)&(i<274)&(j>1)&(j<346))
                        for(u=-1;u<=1;u++)
                        {
                                for(v=-1;v<=1;v++)
                                {
                                        if((in2[i+u][j+v]==0)&(*in3[i+u][j+v]-*seed<=*threshold))
                                        {
                                        in2[i+u][j+v]=in3[i+u][j+v];                  
                     count = count+1;                              
                       s = s+*in3[i+u][j+v];
                                        }
                                }
                        }
        }

  }
}

}
          t=t+1;
        //  printf("finish NO.%d seed\n",t);
          }
          out[g][h] = in2[g][h];
  }
}

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
   int m,n;
   double *data1,*data2,*data3,*data4,*data5,*dataout;                 //
   double *data1f_gpu[274][346],*data2f_gpu[274][346],*data3f_gpu[274][346],*out_gpu[274][346];  //引入参数  Y,Z,I,M,N seed, threshold
   int *canshu1,*canshu2;
// mxClassID category;
  // if(nrhs !=nlhs)
  // {
  //   mexErrMsgTxt("The number of input and output arguements must be the same.") ;   
  // }

//  for(i=0;i<nrhs;i++)
     // {
      m=mxGetM(prhs[0]);
      n=mxGetN(prhs[0]);
     
     plhs[0]=mxCreateDoubleMatrix(m,n,mxREAL);                   //Y  错
        // plhs[1]=mxCreateDoubleMatrix(m,n,mxREAL);                   //Z  错
        // plhs[2]=mxCreateDoubleMatrix(m,n,mxREAL);                  //I   错
        // plhs[3]=mxCreateDoubleMatrix(1,1,mxREAL);                   //seed   错   
        // plhs[4]=mxCreateDoubleMatrix(1,1,mxREAL);                       //threshold   错

     cudaMalloc((void**)&data1f_gpu,sizeof(double)*m*n);
     cudaMalloc((void**)&data2f_gpu,sizeof(double)*m*n);
     cudaMalloc((void**)&data3f_gpu,sizeof(double)*m*n);
     cudaMalloc((void**)&canshu1,sizeof(int)*1*1);
     cudaMalloc((void**)&canshu2,sizeof(int)*1*1);
      cudaMalloc((void**)&out_gpu,sizeof(double)*m*n);
     
        data1=mxGetPr(prhs[0]);                                                     //意思是data1=prhs[i]??
       cudaMemcpy(data1f_gpu,data1,sizeof(double)*m*n,cudaMemcpyHostToDevice);
           data2=mxGetPr(prhs[1]);                                                     //意思是data1=prhs[i]??
       cudaMemcpy(data2f_gpu,data2,sizeof(double)*m*n,cudaMemcpyHostToDevice);
           data3=mxGetPr(prhs[2]);                                                     //意思是data1=prhs[i]??
       cudaMemcpy(data3f_gpu,data3,sizeof(double)*m*n,cudaMemcpyHostToDevice);
           data4=mxGetPr(prhs[3]);                                                     //意思是data1=prhs[i]??
       cudaMemcpy(canshu1,data4,sizeof(int)*1*1,cudaMemcpyHostToDevice);
           data5=mxGetPr(prhs[4]);                                                     //意思是data1=prhs[i]??
       cudaMemcpy(canshu2,data5,sizeof(int)*1*1,cudaMemcpyHostToDevice);



   //   dim3 dimBlock(128);
   //  dim3 dimGrid((m*n)/dimBlock.x);
    //   if((n*m)% 128 !=0)
     //       {
     //      dimGrid.x +=1;   
    //     }
       dataout=(double *)mxMalloc(sizeof(double)*m*n);
        square_elements<<<1,1,0>>>(data1f_gpu,data2f_gpu,data3f_gpu,out_gpu,canshu1,canshu2);
        cudaMemcpy(dataout,out_gpu,sizeof(double)*m*n,cudaMemcpyDeviceToHost);
        dataout=mxGetPr(plhs[0]);
    //    for(i=0;i<274;i++)
     //  {
      //   for(j=0;j<346;j++)
       //   { *out2[i][j]=dataout[i*274+j];
       //   }   
      //  }
    //    mxFree(data1f);
      //  mxFree(data2f);
      //  cudaFree(data1f_gpu);
      //  cudaFree(data2f_gpu);
     // }
mexPrintf("dataout:%d\n",dataout);
mexPrintf("NICE!");
}
发表于 2015-4-8 21:16:12 | 显示全部楼层

1 plhs[0]=mxCreateDoubleMatrix(m,n,mxREAL);                   //Y  错
这句想说什么意思,matlab在这报错了?这句我理解的就是给plhs一个内存空间

2 data1=mxGetPr(prhs[0]);                                                     //意思是data1=prhs[i]??
我觉得就是这个意思,但是不是应该改为data1=(double *)mxGetPr(prhs[0]);
把mxget到的pointer强制类型转化为double型指针再用?

额,手头没matlab,只是最近用matlab的一点想法
回复 支持 反对

使用道具 举报

发表于 2015-4-8 21:17:52 | 显示全部楼层
acalephs1 发表于 2015-4-8 21:16

1 plhs[0]=mxCreateDoubleMatrix(m,n,mxREAL);                   //Y  错
这句想说什么意思,matlab ...

希望给出报错的信息,不在办公室,手头没matlab。。。没法跑,见谅
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-13 18:07:53 | 显示全部楼层
acalephs1 发表于 2015-4-8 21:17
希望给出报错的信息,不在办公室,手头没matlab。。。没法跑,见谅

问题已解决,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-4-2 23:06 , Processed in 0.054455 second(s), 13 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表