2014-04-24 3 views
1

문제가 있습니다. 루프에 두 개의 커널이 있으며 맨 위에 있습니다. 첫 번째 커널이 예를 들어 초당 10 회, 예를 들어 5 번 실행 되더라도 모든 실행 커널의 총 시간을보고 싶습니다.OpenCL 측정 커널 시간

대단히 감사합니다.

for (int arrayLength = minLengthArray; arrayLength <= N; arrayLength *= 2) 
{ 
    int threadCount = 0; 
    int batchSize = N/arrayLength; 
    int GroupCount = (batchSize * arrayLength)/SHARED_SIZE_LIMIT; 
    size_t local = SHARED_SIZE_LIMIT/2; 
    size_t global = local * GroupCount; 

    if (arrayLength <= SHARED_SIZE_LIMIT) 
    { 
     err = clEnqueueNDRangeKernel(commands, ddEvenMergeSortSharedKernel, 1, NULL, &global, &local, 0, NULL, NULL); 
    } 
    else 
    { 
     clSetKernelArg(oddEvenMergeSortSharedKernel, 5, sizeof(unsigned int), &SHARED_SIZE_LIMIT); 
     err = clEnqueueNDRangeKernel(commands, oddEvenMergeSortSharedKernel, 1, NULL, &global, &local, 0, NULL, NULL); 

     for (int size = 2 * SHARED_SIZE_LIMIT; size <= arrayLength; size <<= 1) 
      for (unsigned stride = size/2; stride > 0; stride >>= 1) 
      { 
       global = batchSize * arrayLength; 
       local = 256; 

       err = clEnqueueNDRangeKernel(commands, oddEvenMergeSortGlobalKernel, 1, NULL, &global, &local, 0, NULL, NULL); 
      } 
    } 
} 
+0

"이 커널을 모두 실행하는 데는 총 T 초가 걸렸습니다"라는 단일 숫자를 원하십니까? 아니면 개별 커널 호출마다 실행 시간을 원하십니까? – jprice

답변

3

타이밍을 "예약하는"방법에 부분적으로 달려 있습니다.

일부 일반 힌트 : 당신이, 당신의 루프에서

commands = clCreateCommandQueue(
    context, device, CL_QUEUE_PROFILING_ENABLE, &err); 

:

당신은 당신의 명령 대기열을 만들 때 CL_QUEUE_PROFILING_ENABLE 플래그를 전달하여, 명령 큐에 대한 이벤트 프로파일 링을 가능하게 할 것이다 커널 호출에 대한 이벤트를 생성합니다. 여기에는 여러 가지 옵션이 있습니다. 커널 호출 (일부 벡터, 목록 또는 배열)에 대한 이벤트를 수집하거나 각 이벤트의 타이밍을 개별적으로 수행 할 수 있습니다. 첫 번째 커널 sketeched 다음의 기본적인 방법은 그에 따라 축적 될 수있다 (에러 핸들링 생략)

cl_event event0; // creating an event variable for timing 
clEnqueueNDRangeKernel(commands, ddEvenMergeSortSharedKernel, 
    1, NULL, &global, &local, 0, NULL, &event0); // Pass in event here 

clWaitForEvents (1, &event0); // Wait for the event 

// Obtain the start- and end time for the event 
unsigned long start = 0; 
unsigned long end = 0; 
clGetEventProfilingInfo(event0,CL_PROFILING_COMMAND_START, 
    sizeof(cl_ulong),&start,NULL);  
clGetEventProfilingInfo(event0,CL_PROFILING_COMMAND_END, 
    sizeof(cl_ulong),&end,NULL); 

// Compute the duration in nanoseconds 
unsigned long duration = end - start; 

// Don't forget to release the vent 
clReleaseEvent(event0); 

(나노초) 기간 일 것이다. 두 번째 커널에도 동일한 구성표를 사용할 수 있습니다. 관련 일부 상용구 코드가있다

  • :

    그러나, 당신은 몇 가지 사항을 고려해야합니다. 어쩌면이 메소드를 편의 메소드 (예 : duration = processEvent(event0))로 추출하여 주어진 이벤트를 기다린 다음 이벤트 지속 기간을 계산하고 이벤트를 해제하고 계산 된 기간을 리턴하십시오.

  • 코드가 이벤트를 기다리고 있다는 사실 어떤 경우

그리고 가장 중요한의 런타임 동작에 영향을 미칠 수 있습니다 : 당신이 절대적이 "프로그래밍 방식으로 액세스 할"필요가없는 경우

  • , 당신은 단순히 프로파일 러에서 코드를 실행하는 것이 좋습니다. 이것은 원하는 정보, 즉 명령 대기열에서 각 커널에 소요 된 시간을 제공해야합니다.