用户
 找回密码
 立即注册
xibi199011 该用户已被删除
发表于 2013-11-26 13:19:56
2669019
请问怎样创建二维的动态结构体数组啊,我的是代码是这样的
cPoint** corner1=(cPoint**)malloc(sizeof(cPoint*)*width1);
(*corner1)->data=(int)malloc(sizeof(int)*width1);
(*corner1)->x=(int)malloc(sizeof(int)*width1);
(*corner1)->y=(int)malloc(sizeof(int)*width1);
for (i=0;i<width1;i++)
{
  corner1[i]=(cPoint*)malloc(sizeof(cPoint)*height1);
  corner1[i]->data=(int)malloc(sizeof(int)*height1);
  corner1[i]->x=(int)malloc(sizeof(int)*height1);
  corner1[i]->y=(int)malloc(sizeof(int)*height1);
}
但是不知道对不对,而且按照这种方法创建,我这个函数传进来的参数是没法复制到主存上面的?
希望有人能尽快解答我的疑惑,谢谢!
使用道具 举报 回复
发表于 2013-11-26 13:51:19
楼主您好:

如果您是在kernel中使用的malloc,那么您依然可以复制到host memory的,
但请您注意如下方面:
(1)首先请您将CPoint结构体的实例复制到host memory
(2)然后请您本地(host上)创建一个CPoint的实例。
(3)请您分别为本地实例的data/x/y/缓冲区分配空间。
(4)请您将刚才复制过来的实例的data/x/y指向的device memory中的内容,分别复制到本地实例的data/x/y缓冲区中。
(5)任务完成。

此解决方案可以为您解决问题,请立刻尝试。
感谢来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 14:47:03
玫瑰幻想 发表于 2013-11-26 13:51
楼主您好:

如果您是在kernel中使用的malloc,那么您依然可以复制到host memory的,

您好,那我的创建方法是没错是么?我的几个函数代码:
struct cPoint
{
        int x;   //height
        int y;
        int data;
};
__device__ void qiu(int* reslut,int tid)
{
        int width1=5;
        int height1=10;
        cPoint** corner1=(cPoint**)malloc(sizeof(cPoint*)*width1);
        (*corner1)->data=(int)malloc(sizeof(int)*width1);
        (*corner1)->x=(int)malloc(sizeof(int)*width1);
        (*corner1)->y=(int)malloc(sizeof(int)*width1);
        for (int i=0;i<width1;i++)
        {
                corner1=(cPoint*)malloc(sizeof(cPoint)*height1);
                corner1->data=(int)malloc(sizeof(int)*height1);
                corner1->x=(int)malloc(sizeof(int)*height1);
                corner1->y=(int)malloc(sizeof(int)*height1);
        }
        for (int i=0;i<THREAD_NUM*4;i++)
        {
       
                reslut=i;
        }
}
__global__ static void CudaPlite(char* gray1,char* gray2,int width1,int height1,int width2,int height2,int* reslut)
{
         const int tid=threadIdx.x;
                 qiu(reslut,tid);
}
void CutGrayImg(char* grayData11,char* grayData22,int width1,int height1,int width2,int height2)
{
        int n=THREAD_NUM;
        int len=height1/n;
        int imageSize1,imageSize2;
        imageSize1=(width1+3)/4*4*height1;
        imageSize2=(width2+3)/4*4*height2;

        cudaSetDevice(0);             //CUDA  begin
    cudaDeviceSynchronize();
    cudaThreadSynchronize();

        char* gpuImg1,* gpuImg2;
        int* reslut;
        int xyz[THREAD_NUM*4];

        checkCudaErrors(cudaMalloc((void**)&gpuImg1,sizeof(char)*imageSize1));
        checkCudaErrors(cudaMalloc((void**)&gpuImg2,sizeof(char)*imageSize2));
        checkCudaErrors(cudaMalloc((void**)&reslut,sizeof(int)*n*4));
//        checkCudaErrors(cudaMemset(reslut,0,sizeof(int)*n*4));

        checkCudaErrors(cudaMemcpy(gpuImg1,grayData11,sizeof(char)*imageSize1,cudaMemcpyHostToDevice));
        checkCudaErrors(cudaMemcpy(gpuImg2,grayData22,sizeof(char)*imageSize2,cudaMemcpyHostToDevice));

        CudaPlite<<<1,THREAD_NUM,THREAD_NUM*4*sizeof(int)>>>(gpuImg1,gpuImg2,width1,height1,width2,height2,reslut);

        checkCudaErrors(cudaMemcpy(xyz,reslut,sizeof(int)*n*4,cudaMemcpyDeviceToHost));
        cudaFree(gpuImg1);
        cudaFree(gpuImg2);
        cudaFree(reslut);

但是我如果在qiu函数里面添加了这段二维创建代码之后,在CutGrayImg函数里面就无法将reslut的值复制到xyz上面;如果删除二维数组创建代码,就能复制成功?我不明白为什么?
使用道具 举报 回复 支持 反对
发表于 2013-11-26 15:14:14
xibi199011 发表于 2013-11-26 14:47
您好,那我的创建方法是没错是么?我的几个函数代码:
struct cPoint
{

请您先排排版,

您的大量下标都被吃掉了,无法猜测含义。

谢谢合作。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 16:15:04
玫瑰幻想 发表于 2013-11-26 15:14
请您先排排版,

您的大量下标都被吃掉了,无法猜测含义。

不好意思哦。
struct cPoint
{
int x;   //height
int y;
int data;
};
__device__ void qiu(int* reslut,int tid)
{
              int width1=5;
              int height1=10;
               cPoint** corner1=(cPoint**)malloc(sizeof(cPoint*)*width1);
               (*corner1)->data=(int)malloc(sizeof(int)*width1);
                 (*corner1)->x=(int)malloc(sizeof(int)*width1);
               (*corner1)->y=(int)malloc(sizeof(int)*width1);
             for (int i=0;i<width1;i++)
               {
                          corner1[ i ]=(cPoint*)malloc(sizeof(cPoint)*height1);
                           corner1[ i ]->data=(int)malloc(sizeof(int)*height1);
                              corner1 [ i ]->x=(int)malloc(sizeof(int)*height1);
                           corner1[ i ]->y=(int)malloc(sizeof(int)*height1);
                  }

            for (int i=0;i<THREAD_NUM*4;i++)
                {
                        reslut=i;
                   }
}
__global__ static void CudaPlite(char* gray1,char* gray2,int width1,int height1,int width2,int height2,int* reslut)
{
              const int tid=threadIdx.x;
              qiu(reslut,tid);
}
void CutGrayImg(char* grayData11,char* grayData22,int width1,int height1,int width2,int height2)
{
int n=THREAD_NUM;
int len=height1/n;
int imageSize1,imageSize2;
imageSize1=(width1+3)/4*4*height1;
imageSize2=(width2+3)/4*4*height2;

char* gpuImg1,* gpuImg2;
int* reslut;
int xyz[THREAD_NUM*4];

checkCudaErrors(cudaMalloc((void**)&gpuImg1,sizeof(char)*imageSize1));
checkCudaErrors(cudaMalloc((void**)&gpuImg2,sizeof(char)*imageSize2));
checkCudaErrors(cudaMalloc((void**)&reslut,sizeof(int)*n*4));

checkCudaErrors(cudaMemcpy(gpuImg1,grayData11,sizeof(char)*imageSize1,cudaMemcpyHostToDevice));
checkCudaErrors(cudaMemcpy(gpuImg2,grayData22,sizeof(char)*imageSize2,cudaMemcpyHostToDevice));

CudaPlite<<<1,THREAD_NUM,THREAD_NUM*4*sizeof(int)>>>(gpuImg1,gpuImg2,width1,height1,width2,height2,reslut);

checkCudaErrors(cudaMemcpy(xyz,reslut,sizeof(int)*n*4,cudaMemcpyDeviceToHost));

cudaFree(gpuImg1);
cudaFree(gpuImg2);
cudaFree(reslut);

这样可以吗?当我qiu函数中有添加那部分二维数组创建的代码后,主函数CutGrayImg函数中reslut将无法成功赋值给xyz数组。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 17:34:01
xibi199011 发表于 2013-11-26 16:15
不好意思哦。
struct cPoint
{

LZ您好:

如果您发现某kernel后面原本应该正常执行的步骤并没有按预期执行,请检查一下该kernel 的执行情况,并逐步分析。

您可以在kernel后面添加cudaDeviceSynchronize()函数,并检查这个函数的返回值,以得到kernel的异步错误信息。

此外,关于二维结构体数组,2#中玫瑰斑竹已经说过,上详不赘。以及您3#的代码中并没有体现出您理解和实践了玫瑰斑竹的建议。

大致如此,祝您编码顺利~
使用道具 举报 回复 支持 反对
发表于 2013-11-26 18:00:52
ice 发表于 2013-11-26 17:34
LZ您好:

如果您发现某kernel后面原本应该正常执行的步骤并没有按预期执行,请检查一下该kernel 的执行 ...

我不需要得到二维数组那里的值,只是因为他的创建影响了我其它变量的值的操作,我只是想知道为什么,而不是去获取这个二维数组的值
使用道具 举报 回复 支持 反对
发表于 2013-11-26 18:02:40
xibi199011 发表于 2013-11-26 18:00
我不需要得到二维数组那里的值,只是因为他的创建影响了我其它变量的值的操作,我只是想知道为什么,而不 ...

我不需要知道您的问题是为什么,我只是想告诉您出了问题应该应该以怎样的步骤解决。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 18:22:44
ice 发表于 2013-11-26 18:02
我不需要知道您的问题是为什么,我只是想告诉您出了问题应该应该以怎样的步骤解决。 ...

版主您好:
1.我不需要得到二维数组的值,它只用在kernel内,所以我看到玫瑰版主的回复就认为我没有正确的表达出我的意思,让他误解我是要将二维数组复制到主存上面,而我觉得我的要求不需要,所以就没按照他的意思来做。
2.在我这边没有看到有下标被吃掉的问题。
3.我在CutGrayImg函数里面用了cudaDviceSynchronize()函数,返回值是30
使用道具 举报 回复 支持 反对
发表于 2013-11-26 18:25:05
xibi199011 发表于 2013-11-26 18:22
版主您好:
1.我不需要得到二维数组的值,它只用在kernel内,所以我看到玫瑰版主的回复就认为我没有正确 ...

我也不知道是不是我表达能力过差,或者理解能力过弱,我还没理解版主们的意思,能否详说。
使用道具 举报 回复 支持 反对
12下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册