2017-02-05 2 views
3

Können die Bitset-Funktionen in der OpenACC-Region verwendet werden? Ein Beispiel-Code:Kann ich die Funktionen von Std :: Bitset mit OpenACC verwenden?

#include <string.h> 
#include <bitset> 

#pragma acc routine seq 
int mystrcmp (const char *, const char *); 
int main(int argc, char** argv) 
{ 
    long sum = 3, i; 
    std::bitset<11> vv; 
    char *str; 
    char *str2; 

    #pragma acc parallel loop reduction(+:sum) 
    for(i = 0; i<5000000000; ++i) 
    { 
     sum +=i%2; 
     if(i == 1){ 
      mystrcmp(str, str2); 
      vv.count(); 
     } 
    } 
    return 0; 
} 
int mystrcmp (const char *s1, const char *s2) {...} 

Wenn ich den Code oben mit pgc++ -fast -acc -Minfo=accel -ta=nvidia:managed -DNDEBUG -pgc++libs -g und similars (LD_LIBRARY_PATH =/opt/pgi/linux86-64/lib) kompilieren, erhalte ich die folgende Fehlermeldung: PGCC-S-0155-PGI support procedure called within a compute region: __blt_pgi_popcountl (proba2.cpp: 1288) PGCC-S-0155-Accelerator region ignored; see -Minfo messages (proba2.cpp: 28) main: 28, Accelerator region ignored 1288, Accelerator restriction: unsupported call to support routine '__blt_pgi_popcountl' PGCC/x86 Linux 16.10-0: compilation completed with severe errors, aber der Code besteht aus viel weniger Linien, als 1288.
Ich benutze mystrcmp, weil die eingebaute strcmp erfordert routine seq, aber nach meinem besten Wissen, das ist unmöglich zu lösen.
Aber, wenn die vv.count() auskommentiert ist, dann ist die Kompilierung erfolgreich.
Ich habe viel über OpenACC und OpenACC Probleme gelesen und gesucht, aber ich habe keine entsprechende Antwort auf dieses Problem gefunden.
Was soll ich tun?

Antwort

2

Nein, tut uns leid, aber wir (PGI) haben keine Laufzeitunterstützung für die Routinen "std :: bitset" hinzugefügt. Da dies die erste Anfrage ist, die ich für das Feature gesehen habe, habe ich ein neues RFE (TPR # 23746) eingereicht und es an unsere Compiler-Ingenieure gesendet, um zu sehen, was wir tun können.

+0

Danke für die Antwort. Ich möchte auch fragen, dass der pgC++ - Compiler den Operator << unterstützt, parallele Regionen zu verwenden? weil ich nicht denke. – fokhagyma

+0

Binary Shift-Operatoren sollten gut funktionieren. Haben Sie ein Beispiel für das Problem, das Sie sehen? –

+0

Okay. Ich habe die falsche Frage gestellt. Die << überladenen Operatoren dachte ich. Zum Beispiel: std :: string str = "etwas"; #pragma acc kernels für (vorzeichenlose kurze int count = 1; count <= size; count ++) {std :: cout << str; } Dann benötigt der Compiler routinemäßige Informationen. – fokhagyma

Verwandte Themen