2016-10-22 5 views
0

Also habe ich ein Projekt, das ich auf Mac Pro mit doppelten Datentyp erstellt habe und es funktioniert perfekt. Jetzt habe ich mein Projekt auf MacBook Air verschoben und es fing an, mirOpenCL double precision funktioniert nicht

Fehler zu geben. Der Grund dafür ist, dass mein MacBook Air den Double-Precision-Typ mit OpenCL nicht unterstützt. Aber im Gegenteil, ich habe folgendes gefunden: OpenCL-Kernelfehler unter Mac OSx. Ich wendete die Methode in der Antwort wie folgt aus:

cl_device_fp_config cfg; 
clGetDeviceInfo(devicesIds[0], CL_DEVICE_DOUBLE_FP_CONFIG, sizeof(cfg), &cfg, NULL); // 0 is for the device number I guess? 
printf("Double FP config = %llu\n", cfg); 

Und er erklärte, dass, wenn das Ergebnis 0 ist, dann bedeutet dies, dass mit doppelter Genauigkeit wird nicht unterstützt. Aber ich habe dieses Ergebnis:

Double FP config = 63 

Ich habe auch versucht, diese Methode:

if (!cfg) { 
    printf("Double precision not supported \n\n"); 
} else { 
    printf("Following double precision features supported:\n"); 

    if(cfg & CL_FP_INF_NAN) 
     printf(" INF and NaN values\n"); 

    if(cfg & CL_FP_DENORM) 
     printf(" Denormalized numbers\n"); 

    if(cfg & CL_FP_ROUND_TO_NEAREST) 
     printf(" Round To Nearest Even mode\n"); 

    if(cfg & CL_FP_ROUND_TO_INF) 
     printf(" Round To Infinity mode\n"); 

    if(cfg & CL_FP_ROUND_TO_ZERO) 
     printf(" Round To Zero mode\n"); 

    if(cfg & CL_FP_FMA) 
     printf(" Floating-point multiply-and-add operation\n\n"); 
} 

Und ich habe folgende Ergebnisse:

Double FP config = 63 
Following double precision features supported: 
    INF and NaN values 
    Denormalized numbers 
    Round To Nearest Even mode 
    Round To Infinity mode 
    Round To Zero mode 
    Floating-point multiply-and-add operation 

Was ist hier los? Unterstützt mein System doppelte Genauigkeit mit OpenCL oder nicht? Wenn ja, wie kann ich es aktivieren und verwenden? Wenn nicht, was sind meine Alternativen? Jetzt bin ich sehr verwirrt. Zu allererst, ich weiß nicht, ob mein MacBook Air doppelte Genauigkeit unterstützt oder nicht? Anscheinend tut es das nicht. Aber mit der Ausgabe scheint es so zu sein.

Wenn es keine doppelte Genauigkeit unterstützt, was soll ich tun? Sollte ich in meinem Projekt alles ändern, um Werte zu floaten? ODER wenn ja, wie kann ich es aktivieren? Weil ich viele Tutorials und Beispiele verfolgt habe und keiner von ihnen funktioniert. z.B. https://streamcomputing.eu/blog/2013-10-17/writing-opencl-code-single-double-precision/ aber keiner von ihnen scheint zu funktionieren.

EDIT:

+0

Woher wissen Sie, dass der Grund für die -11 mit anderen Worten 'CL_BUILD_PROGRAM_FAILURE' ist, dass das Gerät Doubles nicht unterstützt? Bitte posten Sie Ihr CL-Build-Protokoll. Sie können es mit 'clGetProgramBuildInfo' holen. – maZZZu

+0

Weil, als ich einen sehr minimalen Kernel ohne Doppel verwendet habe, hat es perfekt funktioniert. Aber sobald ich ein Double in den Kernel einführte, gab es mir diesen Fehler. Keine Sorge, meine Untersuchungen, warum Doppelgänger nicht funktionieren, basieren auf soliden Beobachtungen. Ich stecke seit Wochen in diesem Problem fest. –

+0

Ohne zu wissen, welches Gerät 0 auf Ihrem System ist, ist es schwer zu wissen, ob dies ein Fehler in den Treibern ist oder nicht. Bitte geben Sie auch das Build-Protokoll an - Sie können die Funktion 'clGetProgramBuildInfo' verwenden. Wenn Sie den Code Ihres minimalen Kernels posten könnten, würde das auch helfen. – chippies

Antwort

1

Leider double Unterstützung ist „optional“ in OpenCL unterstützen einige Geräte es und manche nicht ...
Wenn ein Gerät double unterstützt dann die Geräteerweiterungen (CL_DEVICE_EXTENSIONS) enthält cl_khr_fp64 oder cl_khr_fp64.

Es gibt einige Beispiel Kernel-Code here Floats zu verwenden, wenn Doppel nicht verfügbar sind.

Verwandte Themen