0

デバイスで2D配列を作成し、カーネル関数で非常に基本的な操作を行っている単純なcudaプログラムを作成しており、操作後にホストの2D配列にコピーしています。このコードは、stackoverlow と cuda フォーラムのいくつかのスレッドをたどってから書きました。提案された内容に従いましたが、取得しているコードの出力は0ですが、配列のすべてのメンバーに対して10の出力が期待されています。私は以下のコードを投稿しています:

__global__ void test_kernel(int *dev_ptr[])
{
    int tidx = threadIdx.x;
    int tidy = threadIdx.y;

    dev_ptr[tidx][tidy] = dev_ptr[tidx][tidy] +10;
}

int main(int argc,char *argv[])
{

    int env_end =50;
    int **h_ptr ;
    int **d_ptr ;
    int **env_t;
    int i,k,j;
    /************************************************************************/
    /* cpu
    /************************************************************************/
    env_t =(int **) malloc(env_end * sizeof *env_t);
    for(k=0;k<env_end;k++)
    {env_t[k] = (int *)malloc(env_end* env_end* sizeof *env_t[0]);                                                                                                                             
    }

    for (k = 1; k < env_end; ++k)
        env_t[k] = env_t[k - 1] + env_end;

    memset(*env_t, 0, env_end * env_end* sizeof **env_t);

    for (i=0;i<env_end;i++)
    {  for(j=0;j<env_end;j++)
    {printf("%d\t",env_t[i][j]);        }
    if (j==env_end-1)
    {printf("\n");  }
    }

    /************************************************************************/
    /* gpu
    /************************************************************************/

    h_ptr = (int **)malloc(env_end*sizeof(int *));
    for (i=0;i<env_end;i++)
    {  cudaMalloc((void **)&h_ptr[i],env_end*sizeof(int));
        cudaMemcpy(h_ptr[i],&env_t[i][0],env_end*sizeof(int),cudaMemcpyHostToDevice);
    }

    cudaMalloc((void ***)d_ptr,env_end*sizeof(int));
    cudaMemcpy(d_ptr,h_ptr,env_end*sizeof(int),cudaMemcpyHostToDevice);


    /************************************************************************/
    /* kernel function and declaration
    /************************************************************************/

          dim3 blockDim(env_end,env_end,1);

          test_kernel<<<1,blockDim>>>(d_ptr);


    /************************************************************************/
    /* Copying data back to host
    ************************************************************************/
          for (i=0;i<env_end;i++)
          {cudaMemcpy(env_t[i],h_ptr[i],env_end*sizeof(int),cudaMemcpyDeviceToHost);
          }

          for (i=0;i<env_end;i++)
          {  for(j=0;j<env_end;j++)
          {printf("%d\t",env_t[i][j]);      }
          if (j==env_end-1)
          {printf("\n");    }
          }

    /************************************************************************/
    /* Freeing the memory locations
    /************************************************************************/
          for (i=0;i<env_end;i++)
          {cudaFree(h_ptr[i]);
          }

          cudaFree(d_ptr);
          free(h_ptr);

          for (i=0;i<env_end;i++)
          { free(env_t[i]);
            }
          free(env_t);

}

もう 1 つは、MS Visual Studio 2010 でコードを書いているときに、デバッグ アサーションの失敗の通知が表示されることです。何が間違っていたのか、なぜこの通知が来るのかわかりません。ご助力いただきありがとうございます。

4

1 に答える 1

2

このコードにはいくつかの問題があります。含む:

  • h_ptrenv_t、およびの間でサイズが一致しませんd_ptr
  • for&の代わりに使用します。(***void)cudaMalloc
  • によってホスト メモリを割り当てないでくださいcudaMalloc
  • 最適化: 2D メモリは、結果としてグローバル メモリに割り当てられません。1D メモリを割り当て、2D として参照します。

完全なコードは次のとおりです。

#include <stdio.h>
#define SIZE 10
#define INDEX(i,j,k) i*k+j

__global__ void test_kernel(int *dev_ptr, int row_size)
{
    int tidx = threadIdx.x;
    int tidy = threadIdx.y;

    dev_ptr[INDEX(tidx,tidy,row_size)] = dev_ptr[INDEX(tidx,tidy,row_size)] +10;
}

int main(int argc,char *argv[])
{

    int env_end =SIZE;
    int *d_ptr=NULL;
    int *env_t;
    int i,j;

    /************************************************************************/
    // cpu
    /************************************************************************/
    env_t =(int *) malloc(env_end * env_end * sizeof(int));
    memset(env_t, 0, env_end * env_end* sizeof(int));

    printf("Input Array:\n");
    for (i=0;i<env_end;i++)
    {   for(j=0;j<env_end;j++)
        {printf("%d\t",env_t[INDEX(i,j,env_end)]);        }
        printf("\n");
    }
    printf("\n");


    /************************************************************************/
    // gpu
    /************************************************************************/
    cudaMalloc(&d_ptr,env_end*env_end*sizeof(int));
    cudaMemcpy(d_ptr,env_t,env_end*env_end*sizeof(int),cudaMemcpyHostToDevice);

    /************************************************************************/
    // kernel function and declaration
    /************************************************************************/
    dim3 blckDim(env_end,env_end,1);
    test_kernel<<<1,blckDim>>>(d_ptr, env_end);


    /************************************************************************/
    // Copying data back to host
    /************************************************************************/
    cudaMemcpy(env_t,d_ptr,env_end*env_end*sizeof(int),cudaMemcpyDeviceToHost);

    printf("Output Array:\n");
    for (i=0;i<env_end;i++)
    {  for(j=0;j<env_end;j++)
        {printf("%d\t",env_t[INDEX(i,j,env_end)]);      }
        printf("\n");
    }
    printf("\n");

    /************************************************************************/
    // Freeing the memory locations
    /************************************************************************/

    cudaFree(d_ptr);
    free(env_t);

}
于 2012-11-08T07:35:19.507 に答える