Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在CUDA内核中索引Matlab数组_C++_Matlab_Matrix_Cuda - Fatal编程技术网

C++ 如何在CUDA内核中索引Matlab数组

C++ 如何在CUDA内核中索引Matlab数组,c++,matlab,matrix,cuda,C++,Matlab,Matrix,Cuda,我正在研究用Matlab编写的程序的并行化 目前,我有以下代码: #define _USE_MATH_DEFINES #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <math.h> __global__ void radialAverage(double** image, int x_center, int y_center) { int i, x, y; co

我正在研究用Matlab编写的程序的并行化

目前,我有以下代码:

#define _USE_MATH_DEFINES

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <math.h>

__global__ void radialAverage(double** image, int x_center, int y_center)
{
    int i, x, y;

    const int x_size = 400;
    const int y_size = 400;

    int thread = blockIdx.x*blockDim.x+threadIdx.x;

    double angle     = 0;
    double dAngle    = M_PI/360;

    double radImgMat[x_size][y_size];
    double angleMatPi[x_size][y_size];


    //radImMap erstellen
    for( x = 0; x < x_size; x++) {
        for( y = 0; y < y_size; y++) {
        radImgMat[x][y]  = sqrt((double)(x+1-x_center)*(x+1-x_center) + (y+1-y_center)*(y+1-y_center));
        }
    }

    //Angle-Matrix (pi-pi) erstellen
    for ( x = 0; x < x_size; x++) {
        for( y = 0; y < y_size; y++) {
            float xD = x+1-x_center;
            float yD = y+1-y_center;
            if(yD>0) {
                angleMatPi[x][y] = -1*(atan(xD/yD)+M_PI/2)+M_PI;
            } else if(yD==0 && xD<0) {
                angleMatPi[x][y] = M_PI;
            } else if(yD==0 && xD>0) {
                angleMatPi[x][y] = 0;
            } else {
                angleMatPi[x][y] = -1*(atan(xD/yD)+M_PI/2);
            }
        }
    }

    //Cut ImgMat
    for(x=0; x < x_size; x++) {
        for(y = 0; y < y_size; y++) {
            if((angleMatPi[x][y] < (angle-dAngle)) || (angleMatPi[x][y] > (angle+dAngle))) {
                image[x][y] = 0;
            }               
        }
    }
}
定义使用数学定义
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
__全局无效半径平均值(双**图像,整数x\u中心,整数y\u中心)
{
int i,x,y;
常数int x_size=400;
const int y_size=400;
int thread=blockIdx.x*blockDim.x+threadIdx.x;
双角度=0;
双悬挂=M_PI/360;
双半径材料[x_尺寸][y_尺寸];
双角钢[x_尺寸][y_尺寸];
//雷迪迈普·厄斯泰伦
对于(x=0;x0){
角度π[x][y]=-1*(阿坦(xD/yD)+M_π/2)+M_π;
}else if(yD==0&&xD0){
angleMatPi[x][y]=0;
}否则{
角度π[x][y]=-1*(atan(xD/yD)+M_π/2);
}
}
}
//切割ImgMat
对于(x=0;x(角点+悬挂))){
图像[x][y]=0;
}               
}
}
}
在纯C++中,它工作得很好,但是我尝试时会出错。 索引
int*图像
矩阵,该矩阵应为2D。你们当中有人吗
你知道如何访问给定矩阵的内容吗?

我发现代码有三个问题。首先,我们需要确保图像数据被复制到GPU并传递到内核。您可能已经这样做了,但我们需要查看主机代码才能知道。在主机上运行的代码应该如下所示

int *d_image;
cudaMalloc((void**)&d_image,x_size*y_size*sizeof(int)); //allocate memory on the GPU for the image

cudaMemcpy(d_image,image,x_size*y_size*sizeof(int),cudaMemcpyHostToDevice); //copy the image to GPU global memory

radialAverage<<<numBlocks,numThreads>>>(d_image,x_size,y_size,x_center,y_center); //Call CUDA kernel with device pointer to image data

第三,您的代码根本不是并行的。在计算过程中,您从未引用过“thread”的值,因此您基本上是在整个图像上并行多次执行相同的串行计算。我建议查看一些非常基本的CUDA代码,了解其工作原理。UDACITY有一个很棒的关于CUDA和并行编码的在线视频课程,我强烈推荐

但是,由于OP提到了matlab(可能使用mex或PTX接口),因此没有“主机代码”可供检查。Matlab在调用提供的内核之前在内部进行所有设置。是的,这是我的问题:/但是我认为当我重塑图像并进行1D数组时可以解决它。y:d我做相同的计算是因为我想在添加实际平行部分(径向平均部分)之前测试代码到实际点…您可能已经获得了使用
int**image
编译的代码,但这是您所能得到的,除非您仔细处理@talonmies给出的链接以及下面给出的答案。如果您没有注意到,您的代码格式是一团混乱。代码行的格式应与问题文本分开,缩进4个空格。不要将特殊格式字符
>
放在您发布的每一行的开头。如果您想在此处发布问题,请找出适当的格式,并重新编辑您的问题,直到格式正确,以便于其他人阅读。哦!我现在没有注意到:/sry Edit:我更新了问题
image[y*x_size + x];