2017-02-09 3 views
1

Ich habe versucht, eine einfache Anwendung zu arbeiten, die Cuda, OpenMP und LLVM/Clang auf Win10 verwendet. Aus verschiedenen Quellen der Dokumentation und PowerPoint-Präsentationen, die ich online gefunden habe, glaube ich, dass diese Funktionalität in gewisser Weise unterstützt wird, aber ich bin mir nicht sicher, ob es auf Win10 unterstützt wird und ob es in der Hauptversion ist. Ich benutze LLVM 4.0.0rc1. Ich habe die Binärdatei heruntergeladen, nachdem sie auf verschiedene Arten erfolgreich aus dem Kopf entfernt wurde.Cuda mit OpenMP auf Win10 mit LLVM/Clang

Ich modifizierte diese code, um etwas wie folgt zu sehen. Ich habe auch mit verschiedenen OMP- und C-Varianten experimentiert. Es kompiliert gut. Sie können aus der verbose output sehen, scheint der Build eine fette binäre machen. Interessanterweise scheint es mir egal zu sein, was ich es für ein Ziel gebe (oder ob ich ihm ein Ziel gebe) oder was speziell in omptargets ist. Es führt auch cuda-Funktionen aus, die von nvprof gemeldet werden.

Wenn ich dies ausführen, gehen alle vier meiner Prozessoren zu 100% Nutzung nach Open Hardware Monitor, aber nichts passiert auf der GPU, außer vielleicht geringe Speicherauslastung für die Profilierungsbefehle. Fehle ich etwas, oder geht das einfach nicht?

cudaError_t f; 
int t = 999; 
cudaProfilerStart(); 

printf("Enter\n"); 
#pragma omp target data map(tofrom: x[0:n],y[0:n]) map(tofrom: t,f) 
    { 
     f = cudaGetDevice(&t); 
#pragma omp target teams num_teams(10) thread_limit(192) 
#pragma omp parallel for 
     for (int i = 0; i < n; i++) { 
      for(int j = 0; j < 10000; j++) { 
       y[i] += a * x[i]; 
       y[i] *= 2; 
       y[i] -= x[i]/4; 
       y[i] *= .99; 
      } 
     } 
    } 
cudaProfilerStop(); 

Ausgabe auf nvprof:

==1844== NVPROF is profiling process 1844, command: example.exe 1000000 
Enter 
min = inf, max = inf, avg = 0.000000 0 0 
==1844== Profiling application: example.exe 1000000 
==1844== Profiling result: 
No kernels were profiled. 

==1844== API calls: 
Time(%)  Time  Calls  Avg  Min  Max Name 
98.86% 135.83ms   1 135.83ms 135.83ms 135.83ms cudaProfilerStart 
    0.60% 819.35us  91 9.0030us  0ns 398.73us cuDeviceGetAttribute 
    0.53% 726.09us   1 726.09us 726.09us 726.09us cuDeviceGetName 
    0.00% 5.2860us   1 5.2860us 5.2860us 5.2860us cuDeviceTotalMem 
    0.00% 4.5310us   1 4.5310us 4.5310us 4.5310us cudaGetDevice 
    0.00% 2.6430us   3  881ns  0ns 2.2650us cuDeviceGetCount 
    0.00% 1.5090us   3  503ns  377ns  755ns cuDeviceGet 

Antwort

2

Ich tauschte E-Mails mit einem Ingenieur bei IBM. Der Upstream der fork of LLVM/Clang ist noch in Arbeit. Es gibt auch Unterstützung für x86, aber ob es unter Windows funktioniert, ist unbekannt.

Wenn Sie in meinem Link zu parallel-computing.pro bemerken, gibt es eine ältere Gabel, die OpenMP und Cuda unterstützt. Ich bin nicht sicher, was, wenn überhaupt, die Beziehung zwischen diesen Projekten ist. Wenn Sie sich einen neueren Stand presentation ansehen, ist es klar, dass der neuere Fork OpenMP 4.0 mit der Unterstützung von 4.5 unterstützt und IBM zur Unterstützung seiner Power8-CPUs beiträgt. Dies erklärt teilweise die unsichere Unterstützung von Windows. Ich habe jedoch den Code in GitHub durchsucht und Win32 und Win64 Makros definiert.