2010-10-07 13 views
3

Je viens de passer d'OpenCL 1.0 à 1.1. Quand je fais mon appel à la fonction min(), je reçois la sortie d'erreur:En OpenCL 1.1 mon appel à la fonction min() est ambigu et je ne comprends pas pourquoi

<program source>:45:44: error: call to 'min' is ambiguous 
      int nFramesThisKernelIngests = min(nFramesToIngest - nAvg*nPP*get_global_id(2), nAvg*nPP); 

<built-in>:3569:27: note: candidate function 
double16 __OVERLOADABLE__ min(double16, double16);            
         ^
<built-in>:3568:26: note: candidate function 
double8 __OVERLOADABLE__ min(double8, double8); 

La sortie d'erreur continue pour plus de lignes avec différents types.

Lorsque j'ai tenté d'isoler le problème, get_global_id (2) semble être le problème. Je pensais que lancer get_global_id (2) à un int à partir d'un uint (je crois qu'il renvoie un uint) résoudrait le problème mais ce n'est pas le cas. Est-ce que quelqu'un sait ce qui se passe? J'ai regardé les spécifications 1.0 et 1.1 et je suis toujours confus quant à la raison pour laquelle cela se produit.

Répondre

6

Le OpenCL 1.0 et 1.1 des spécifications définir min pour avoir les signatures de fonction suivantes:

gentype min (gentype x, gentype y) 
gentype min (gentype x, sgentype y) 

Par conséquent, les types d'arguments doivent être les mêmes, ou 1 vecteur et un scalaire correspondant au type élément de vecteur, par exemple

int4 a,b; 
int c; 
min(a,b); // All arguments have the same type 
min(a,c); // 2nd element may be scalar, matching the 
      // element type of the 1st argument (a vector type) 

Notez également que le type de retour de get_global_id est size_t, qui peut être 32 ou 64bits taille.

Vous devrez lancer les résultats d'expression pour sélectionner une surcharge spécifique de min.

Il existe de nombreuses surcharges de min (car le message d'erreur du compilateur indique quelque peu de manière non utile), par ex.

min(float a, float b); 
min(float2 a, float2 b); 
min(float2 a, float b); 
min(float3 a, float3 b); 
min(float3 a, float b); 
min(float4 a, float4 b); 
... // and vector sizes 4,8,16 
min(double a, double b); // With an OpenCL 64bit floating point extension enabled 
min(double2 a, double b); // With an OpenCL 64bit floating point extension enabled 
... // and integral scalar and vector types (char, schar, short, ushort, int, etc) 

... 
+0

Je l'ai fait, convert_int (get_global_id (2)). Cela permet de se débarrasser de l'erreur que j'ai écrite auparavant, mais maintenant je reçois des erreurs de segmentation. Cela pourrait-il avoir quelque chose à voir avec la taille étant de 32 ou 64 bits? Je suis vraiment perdu ... – smuggledPancakes

+0

Un défaut de segmentation est probablement dû à une mauvaise indexation en mémoire ou à une lecture/écriture via des pointeurs hors limites. L'appel de conversion_int est probablement overkill par rapport à un cast de style C. Il n'y a pas assez de contexte dans le code source de la question pour diagnostiquer plus précisément. – grrussel

+0

L'erreur de segmentation semble provenir d'une partie non liée de mon programme. Je crois que ce problème est résolu et il suffit que OpenCL 1.1 soit plus strict sur la façon dont ce paramètre a été calculé. – smuggledPancakes

1

Je ne connais pas vraiment OpenCL, mais il semble que le compilateur ne sache pas s'il doit promouvoir les arguments de min à double8 ou double16. Puisque ces types sont des vecteurs et non des scalaires, je suppose que min n'est pas la fonction que vous recherchez. Essayez plutôt fmin.

EDIT: Voyez-vous ce qui suit dans les messages d'erreur?

<built-in>:xxxx:yy: note: candidate function 
int __OVERLOADABLE__ min(int, int); 

JAB IN THE DARK: Cast tout à int:

int nFramesThisKernelIngests = (int) min(
    (int) (nFramesToIngest - nAvg * nPP * get_global_id(2)), 
    (int) (nAvg * nPP)); 

Si compilant, enlever les moulages par ordre décroissant de niaiserie (par exemple, le premier casting est probablement dénuée de sens, mais YMMV) .

+0

Juste une note sur le double8 et double16. Il y a littéralement 20 autres lignes de sortie d'erreur disant la même chose mais avec des types différents, comme ushort, uint, float2, float4, float8, float16 – smuggledPancakes

+0

Okay ... quels sont les types de 'nFramesToIngest',' nAvg' et 'nPP '? Quel est le type de résultat de 'get_global_id()'? :) –

+0

Ils sont tous int type. – smuggledPancakes