並列実行と順次実行の時間を正しく測定しようとしていますが、次の理由で疑問があります。
次のコードがあるとします。
//get the time
clock_t start,finish;
double totaltime;
start = clock();
double *d_A, *d_B, *d_X;
cudaMalloc((void**)&d_A, sizeof(double) * Width * Width);
cudaMalloc((void**)&d_B, sizeof(double) * Width);
cudaMalloc((void**)&d_X, sizeof(double) * Width);
cudaMemcpy(d_A, A, sizeof(double) * Width * Width, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, B, sizeof(double) * Width, cudaMemcpyHostToDevice);
do_parallel_matmul<<<dimB, dimT>>>(d_A, d_B, d_X, Width);
cudaMemcpy(X, d_X, sizeof(double) * Width, cudaMemcpyDeviceToHost);
finish = clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
printf("%f", totaltime);
この時間は、次のように測定された連続時間よりもはるかに長くなります。
clock_t start,finish;
double totaltime;
start = clock();
do_seq_matmult();
finish = clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
printf("%f", totaltime);
したがって、次のようにCUDAカーネル時間を測定するだけでよいかどうかはわかりません。
clock_t start,finish;
double totaltime;
start = clock();
do_parallel_matmul();
finish = clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
printf("%f", totaltime);
ホストとデバイス間のメモリコピーを回避します。
並列実行と順次実行の比較を提出する必要があるため、上記の質問をしています...しかし、CUDAでメモリコピーを測定する場合、CUDAとCの間に良い違いはありません...
編集:
void do_seq_matmult(const double *A, const double *X, double *resul, const int tam)
{
*resul = 0;
for(int i = 0; i < tam; i++)
{
for(int j = 0; j < tam; j++)
{
if(i != j)
*resul += A[i * tam + j] * X[j];
}
}
}
__global__ void do_parallel_matmul( double * mat_A,
double * vec,
double * rst,
int dim)
{
int rowIdx = threadIdx.x + blockIdx.x * blockDim.x; // Get the row Index
int aIdx;
while( rowIdx < dim)
{
rst[rowIdx] = 0; // clean the value at first
for (int i = 0; i < dim; i++)
{
aIdx = rowIdx * dim + i; // Get the index for the element a_{rowIdx, i}
rst[rowIdx] += (mat_A[aIdx] * vec[i] ); // do the multiplication
}
rowIdx += gridDim.x * blockDim.x;
}
__syncthreads();
}