cuda里有cudaEvent_t,通过typedef struct CUevent_st *cudaEvent_t; 。CUevent_st这个结构体并没有看到源代码。也不需要仔细关注。
cudaEventCreate()函数能创建一个cudaEvent_t类型事件,如果需要记录时间,参数2就不需要写,当然我们现在就需要记录时间。接着cudaEventRecord()函数来记录流逝的时间。再调用cudaEventSynchronize同步一下,来确保我们能在cudaEventRecord()这个函数调用来获取准备的值。然后调用cudaEventElapsedTime()函数来获取时间。最后调用cudaEventDestroy()函数来销毁创建的事件。
下面演示一个代码:
- #include "cuda_runtime.h"
-
- #include <iostream>
- using namespace std;
-
- static void HandleError( cudaError_t err, const char *file, int line )
- {
- if (err != cudaSuccess)
- {
- printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
- file, line );
- exit( EXIT_FAILURE );
- }
- }
- #define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
-
-
- #define DIM 2046
- #define N (DIM * DIM)
- __global__ void add( int *c, const int* a, const int* b )
- {
- int x = blockIdx.x;
- int y = blockIdx.y;
- int offset = x + y * gridDim.x;
- c[offset] = a[offset] + b[offset];
- }
-
- int main()
- {
- cudaEvent_t timeStartEvent,timeEndEvent;
- HANDLE_ERROR ( cudaEventCreate( &timeStartEvent, 0) );
- HANDLE_ERROR ( cudaEventCreate( &timeEndEvent, 0) );
-
- HANDLE_ERROR ( cudaEventRecord( timeStartEvent, 0) );
-
-
- int *a, *b, *c;
- int *dev_a, *dev_b, *dev_c;
-
-
- a = new int[N];
- b = new int[N];
- c = new int[N];
-
- HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(int) ) );
- HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(int) ) );
- HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );
-
-
- for (int i=0; i<N; i++)
- {
- a[i] = i;
- b[i] = 2 * i;
- }
-
- HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice ) );
- HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice ) );
-
- dim3 grid(DIM,DIM);
- add<<<grid,1>>>( dev_c,dev_a,dev_b );
-
- HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost ) );
-
- bool success = true;
- for (int i=0; i<N; i++)
- {
- if ((a[i] + b[i]) != c[i])
- {
- cout << "Error: "<<a[i]<<" + "<<b[i]<<" != "<<c[i]<<endl;
- success = false;
- }
- }
- if (success) cout << "We did it!\n" ;
-
- HANDLE_ERROR( cudaFree( dev_a ) );
- HANDLE_ERROR( cudaFree( dev_b ) );
- HANDLE_ERROR( cudaFree( dev_c ) );
-
- delete[] a;delete[] b; delete[] c;
-
- HANDLE_ERROR ( cudaEventRecord( timeEndEvent, 0) );
- HANDLE_ERROR ( cudaEventSynchronize( timeEndEvent ) );
- float elapsedTime = 0 ;
- HANDLE_ERROR ( cudaEventElapsedTime( & elapsedTime, timeStartEvent, timeEndEvent ) );
-
- cout << "elapsedTime " << elapsedTime << " ms. ";
- HANDLE_ERROR( cudaEventDestroy( timeStartEvent ) );
- HANDLE_ERROR( cudaEventDestroy( timeEndEvent ) );
- return 0;
- }
http://cuda.it168.com/a2011/0810/1230/000001230729.shtml