C++ 如何在CUDA内核中索引Matlab数组
我正在研究用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
#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];