CudaEvents.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:3k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     FastGrid (formerly AutoGrid)
  3.     Copyright (C) 2009 The Scripps Research Institute. All rights reserved.
  4.     Copyright (C) 2009 Masaryk University. All rights reserved.
  5.     AutoGrid is a Trade Mark of The Scripps Research Institute.
  6.     This program is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU General Public License
  8.     as published by the Free Software Foundation; either version 2
  9.     of the License, or (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. */
  18. #if defined(AG_CUDA)
  19. #include <cstdio>
  20. #include "CudaEvents.h"
  21. CudaEvents::CudaEvents(bool enabled, cudaStream_t stream): enabled(enabled), stream(stream)
  22. {
  23.     if (!enabled) return;
  24.     CUDA_SAFE_CALL(cudaEventCreate(&init));
  25.     CUDA_SAFE_CALL(cudaEventCreate(&calc));
  26.     CUDA_SAFE_CALL(cudaEventCreate(&finalize));
  27.     CUDA_SAFE_CALL(cudaEventCreate(&end));
  28. }
  29. CudaEvents::~CudaEvents()
  30. {
  31.     if (!enabled) return;
  32.     CUDA_SAFE_CALL(cudaEventDestroy(init));
  33.     CUDA_SAFE_CALL(cudaEventDestroy(calc));
  34.     CUDA_SAFE_CALL(cudaEventDestroy(finalize));
  35.     CUDA_SAFE_CALL(cudaEventDestroy(end));
  36. }
  37. void CudaEvents::recordInitialization()
  38. {
  39.     if (!enabled) return;
  40.     CUDA_SAFE_CALL(cudaEventRecord(init, stream));
  41. }
  42. void CudaEvents::recordStartCalculation()
  43. {
  44.     if (!enabled) return;
  45.     CUDA_SAFE_CALL(cudaEventRecord(calc, stream));
  46. }
  47. void CudaEvents::recordEndCalculation()
  48. {
  49.     if (!enabled) return;
  50.     CUDA_SAFE_CALL(cudaEventRecord(finalize, stream));
  51. }
  52. void CudaEvents::recordFinalization()
  53. {
  54.     if (!enabled) return;
  55.     CUDA_SAFE_CALL(cudaEventRecord(end, stream));
  56. }
  57. void CudaEvents::printTimes(const InputData *input, int numGridPointsPerMapPadded)
  58. {
  59.     if (!enabled) return;
  60.     float initTime, calcTime, finalizeTime;
  61.     CUDA_SAFE_CALL(cudaEventElapsedTime(&initTime,     init,     calc));
  62.     CUDA_SAFE_CALL(cudaEventElapsedTime(&calcTime,     calc,     finalize));
  63.     CUDA_SAFE_CALL(cudaEventElapsedTime(&finalizeTime, finalize, end));
  64.     double seconds = double(calcTime) / 1000;
  65.     double atoms = input->numReceptorAtoms * double(input->numGridPointsPerMap);
  66.     double atomsPadded = input->numReceptorAtoms * double(numGridPointsPerMapPadded);
  67.     double atomsPerSec = atoms / seconds;
  68.     double atomsPerSecPadded = atomsPadded / seconds;
  69.     fprintf(stderr, "CUDA Initialization: %i msn"
  70.                     "CUDA Kernels: %i msn"
  71.                     "CUDA Finalization: %i msn",
  72.                     int(initTime), int(calcTime), int(finalizeTime));
  73.     fprintf(stderr, "Electrostatics performance: %i million atoms/sn", int(atomsPerSec / 1000000));
  74.     fprintf(stderr, "Electrostatics performance: %i million atoms/s (including grid points added by padding)n", int(atomsPerSecPadded / 1000000));
  75. }
  76. #endif