1

私はCUDAにかなり慣れていません。計算でスレッドIDを使用する必要がありますが、機能しません。remは常に0です。配列内のインデックスを計算するにはスレッドのインデックスが必要なので、計算を行うためにそれらをfloatに変換することはできません。

カーネルは次のとおりです。

_global__ void initializationCubes(float* dVer, float* dCub, int gridSize, float* test)
{   
    int index=blockIdx.x*blockDim.x+threadIdx.x;

    if(index<(gridSize*gridSize*gridSize))
    {

        // conversion index -> i,j,k

        int rem=index;
        int qot=(rem/gridSize);

        int i=rem-(qot*gridSize);

        rem=(rem)/(gridSize);
        qot=(rem/gridSize);

        int j=rem-(qot*gridSize);

        rem=(rem)/(gridSize);
        qot=(rem/gridSize);

        int k=rem-(qot*gridSize);

            for(int x=0;x<7;x++){

             // these first three are used to test
              dCub[index*56+0+x] =index;
              dCub[index*56+7+x] =rem;
              dCub[index*56+14+x]=k;
              dCub[index*56+21+x]=dVer[((i*(gridSize+1)+(j+1))*(gridSize+1)+k)*7+x];
              dCub[index*56+28+x]=dVer[(((i+1)*(gridSize+1)+(j))*(gridSize+1)+k)*7+x];
              dCub[index*56+35+x]=dVer[(((i+1)*(gridSize+1)+(j))*(gridSize+1)+k+1)*7+x];
              dCub[index*56+42+x]=dVer[(((i+1)*(gridSize+1)+(j+1))*(gridSize+1)+k+1)*7+x];
              dCub[index*56+49+x]=dVer[(((i+1)*(gridSize+1)+(j+1))*(gridSize+1)+k)*7+x];

             }

    }   

}


__global__ void initializationVertices(float* dVer, int gridSize){


   int currentVertex=0;

   for(int i=0; i<gridSize+1; i++)
   {
       for(int j=0; j<gridSize+1; j++)
       {
          for(int k=0; k<gridSize+1; k++)
          {

               dVer[currentVertex+0]=((i*2.0f)/(gridSize)-1.0f)*2.0f;
               dVer[currentVertex+1]=((j*2.0f)/(gridSize)-1.0f)*2.0f;
               dVer[currentVertex+2]=((k*2.0f)/(gridSize)-1.0f)*2.0f;

               currentVertex+=7;
          }
       }
 }



extern "C"
void initializationCUDA1( const int verticesAtEndsOfEdges[24], const int eTable[256], int gSize, int numberParticles ) {

 numParticles=numberParticles;

 gridSize=gSize;

 numVertices=(gridSize+1)*(gridSize+1)*(gridSize+1);
 numCubes=(gridSize)*(gridSize)*(gridSize);

 size_t pitchv=7;
 cudaMallocPitch((void**)&dVer, &pitchv, 7 * sizeof(float), (gridSize+1)*(gridSize+1)*(gridSize+1));

 size_t pitchc=7;
 cudaMallocPitch((void**)&dCub, &pitchc, 7 * sizeof(float), (gridSize)*(gridSize)*(gridSize)*8);

 cudaMalloc((void **)&verticesAtEnds, 24*sizeof(int));

 cudaMalloc((void **)&dedgeTable, 256*sizeof(int));

 cudaMalloc((void **)&dtriTable, 256*16*sizeof(int));

 cudaMalloc((void **)&ballPoint, 3*sizeof(float));

 cudaMalloc((void **)&dpositions, 3*numberParticles*sizeof(float));

 cudaMalloc((void **)&dedgeVertices, numCubes*6*12*sizeof(float));

 cudaMalloc((void **)&result, numCubes*18*sizeof(float));

 output=(float*)malloc(numCubes*18*sizeof(float));

 cudaMalloc((void **)&numFaces, 10*sizeof(int));

 cudaMalloc((void **)&test, sizeof(float));




 initializationVertices<<<1,1>>>(dVer, gridSize);

 initializationCubes<<<128,256>>>( dVer, dCub, gridSize, test);

 float* tmp =(float*)malloc(numCubes*56*(sizeof(float)));

 cudaMemcpy(tmp, dCub, numCubes*56*sizeof(float), cudaMemcpyDeviceToHost);
 for(int a=0;a<100;a++){
   printf("%f\n",tmp[a]);
 }
}

編集

gridSizeは40です->スレッドの反復は0から64000になります

関数の外で値を出力すると、rem、i、j、およびkはすべて0になります。

size_tピッチv=7; cudaMallocPitch((void **)&dVer、&pitchv、7 * sizeof(float)、(gridSize + 1)(gridSize + 1)(gridSize + 1));

size_tピッチc=7; cudaMallocPitch((void **)&dCub、&pitchc、7 * sizeof(float)、(gridSize)(gridSize)(gridSize)* 8);

initializeCubes <<< 1,1 >>>(dVer、dCub、gridSize、test);

4

1 に答える 1

3

gridSizeがグリッドのサイズである場合、その名前が示すように、remとは両方ともqot、コードの実行後は、それ自体よりも大きい値で除算されるため、常にゼロになります。

3次元グリッドへのインデックスを探している場合、それがまさにその理由threadIdxでありblockIdx、3つのコンポーネントがあります。高価な分割はまったく必要ありません。次の標準コードスニペットを使用するだけです。

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int k = blockIdx.z * blockDim.z + threadIdx.z;

if (i < myBlockSize.x && j < myBlockSize.y && k<myBlockSize.z) {
    // your kernel code...
}

ブロックサイズとグリッドサイズのyコンポーネントとzコンポーネントの適切な値、およびmyBlockSize目的のグリッドサイズに設定されたパラメーターまたはグローバル変数を使用してカーネルを起動します(整数のブロックサイズとグリッドサイズに因数分解できない場合)。

于 2012-12-07T10:31:42.303 に答える