1

最初に CPU から GPU メモリに、またはその逆にデータを転送するコードを実行しようとしています。データ量が増えても、データ転送時間は、実際にデータ転送が行われていない場合と変わりません。コードを掲載しています。

#include <stdio.h>  /* Core input/output operations                         */
#include <stdlib.h> /* Conversions, random numbers, memory allocation, etc. */
#include <math.h>   /* Common mathematical functions                        */
#include <time.h>   /* Converting between various date/time formats         */
#include <cuda.h>   /* CUDA related stuff                                   */
#include <sys/time.h>
__global__ void device_volume(float *x_d,float *y_d)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
}

int main(void)
{
    float *x_h,*y_h,*x_d,*y_d,*z_h,*z_d;
    long long  size=9999999;
    long long nbytes=size*sizeof(float);

    timeval t1,t2;
    double et;

    x_h=(float*)malloc(nbytes);
    y_h=(float*)malloc(nbytes);

    z_h=(float*)malloc(nbytes);

    cudaMalloc((void **)&x_d,size*sizeof(float));
    cudaMalloc((void **)&y_d,size*sizeof(float));
    cudaMalloc((void **)&z_d,size*sizeof(float));
    gettimeofday(&t1,NULL);

    cudaMemcpy(x_d, x_h, nbytes, cudaMemcpyHostToDevice);
    cudaMemcpy(y_d, y_h, nbytes, cudaMemcpyHostToDevice);
    cudaMemcpy(z_d, z_h, nbytes, cudaMemcpyHostToDevice);

    gettimeofday(&t2,NULL);
    et = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
    et += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
    printf("\n %ld\t\t%f\t\t",nbytes,et);
    et=0.0;
    //printf("%f %d\n",seconds,CLOCKS_PER_SEC); 

    // launch a kernel with a single thread to greet from the device
    //device_volume<<<1,1>>>(x_d,y_d);
    gettimeofday(&t1,NULL);

    cudaMemcpy(x_h, x_d, nbytes, cudaMemcpyDeviceToHost);
    cudaMemcpy(y_h, y_d, nbytes, cudaMemcpyDeviceToHost);
    cudaMemcpy(z_h, z_d, nbytes, cudaMemcpyDeviceToHost);

    gettimeofday(&t2,NULL);

    et = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
    et += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
    printf("%f\n",et);
    cudaFree(x_d);
    cudaFree(y_d);
    cudaFree(z_d); 
    return 0;
}

誰でもこの問題で私を助けることができますか?

ありがとう

4

2 に答える 2

1
  1. GPU コードの時間をキャプチャするには、cudaEvent を試してください。
  2. ビジュアル プロファイラーを使用して、memcpy に費やされた時間を確認してみてください。プロファイラーは、cuda 関連の操作ごとに GPU で費やされたすべての実行時間を表示します。
于 2012-10-31T04:57:20.027 に答える
0

同じ時間がかかるので、同じままです。コードでは、転送時間を合計しません。

于 2012-10-30T17:48:39.717 に答える