2

SM とメモリの使用率、消費電力などの観点から、いくつかの CUDA Rodinia ベンチマークのプロファイルを作成しようとしています。そのために、ベンチマークと、NVML ライブラリを使用して GPU 実行をプロファイルするために基本的に pthread を生成するプロファイラーを同時に実行します。

問題は、ベンチマークがプロファイラーで実行されている場合よりも、プロファイラーを一緒に呼び出さない場合、ベンチマークの実行時間がはるかに長い (約 3 倍) ことです。CPU の周波数スケーリング ガバナーはユーザー空間なので、CPU の周波数が変化しているとは思いません。GPU周波数のちらつきが原因ですか?以下は、プロファイラーのコードです。

#include <pthread.h>
#include <stdio.h>
#include "nvml.h"
#include "unistd.h"
#define NUM_THREADS     1

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
  // printf("Hello World! It's me, thread #%ld!\n", tid);

nvmlReturn_t result;
nvmlDevice_t device;
nvmlUtilization_t utilization;
nvmlClockType_t jok;
unsigned int device_count, i,powergpu,clo;
char version[80];
result = nvmlInit();
result = nvmlSystemGetDriverVersion(version,80);
printf("\n Driver version: %s \n\n", version);
result = nvmlDeviceGetCount(&device_count);
printf("Found %d device%s\n\n", device_count,
device_count != 1 ? "s" : "");
printf("Listing devices:\n");
result = nvmlDeviceGetHandleByIndex(0, &device);

while(1)

{
result = nvmlDeviceGetPowerUsage(device,&powergpu );
result = nvmlDeviceGetUtilizationRates(device, &utilization);
printf("\n%d\n",powergpu);




        if (result == NVML_SUCCESS)
        {
           printf("%d\n",  utilization.gpu);
           printf("%d\n",  utilization.memory);
        }
result=nvmlDeviceGetClockInfo(device,NVML_CLOCK_SM,&clo);
if(result==NVML_SUCCESS)
{
printf("%d\n",clo);
}
usleep(500000);
}


pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];

int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }

   /* Last thing that main() should do */
   pthread_exit(NULL);

}
4

1 に答える 1