2

これは、経過時間を計算したい CUDA コードです。私は CUDA にかなり慣れていないので、いくつかの API を試してみました。

      cudaEventRecord(stop, 0);
      cudaEventSynchronize(stop);
      float elapsedTime;
      cudaEventElapsedTime(&elapsedTime, start, stop);

しかし、これらのステートメントを以下のコードに入れる方法がわかりません。つまり、これらのコードを配置する方法がわかりません。これらのステートメントをコードのどこに挿入できるか教えてもらえますか?

        #include<stdio.h>
        #define N 512

     __global__ void add( int *a, int *b, int *c) 
       {
               *c= *a+ *b;
       }

      int main(void) 
       {
        int *a, *b, *c; // host copies of a, b, c
        int *dev_a, *dev_b, *dev_c; // device copies of a, b, c
        int size = N * sizeof(int); // we need space for 512 integers


        // allocate device copies of a, b, c
        cudaMalloc( (void**)&dev_a, size );
        cudaMalloc( (void**)&dev_b, size );
        cudaMalloc( (void**)&dev_c, size );

        a = (int*)malloc( size );
        b = (int*)malloc( size );
        c = (int*)malloc( size );

        //random_ints( a, N );
        //random_ints( b, N );

        // copy inputs to device
        cudaMemcpy( dev_a, a, size, cudaMemcpyHostToDevice);
        cudaMemcpy( dev_b, b, size, cudaMemcpyHostToDevice);

        // launch add() kernel with N parallel blocks
        add <<< N, 1 >>>( dev_a, dev_b, dev_c);

        // copy device result back to host copy of c
        cudaMemcpy( c, dev_c, size, cudaMemcpyDeviceToHost);

        free( a ); free( b ); free( c );

        cudaFree( dev_a);
        cudaFree( dev_b);
        cudaFree( dev_c);


      }
4

1 に答える 1

2

CUDAイベントのタイミングは次のように測定されます。

カーネルの時間を測定したいとしましょうadd

cudaEvent_t start,stop;
float elapsedTime;

cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start,0);

add <<< N, 1 >>>( dev_a, dev_b, dev_c);

cudaEventRecord(stop,0);
cudaEventSynchronize(stop);


cudaEventElapsedTime(&elapsedTime,start,stop);

cout<<"\n\nElapsed Time = "<<elapsedTime<<" milliseconds";
于 2013-01-23T14:33:06.333 に答える