Quand utiliser les types de données scalaires de l’API OpenCL?

J’ai eu du mal à comprendre quand utiliser les types de données de l’API OpenCL, tels que cl_float, cl_uchar, etc., qui peuvent être trouvés ici:

http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/scalarDataTypes.html

Les exemples que j’ai vus et qui impliquent la copie d’un tampon sur le périphérique ressemblent à ceci:

float data[DATA_SIZE]; // original data set given to device //Create the input and output arrays in device memory for our calculation input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, // Write our data set into the input array in device memory err = clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, 0, NULL, NULL); if (err != CL_SUCCESS) { printf("Error: Failed to write to source array!\n"); exit(1); } 

Ce code provient directement d’un exemple de code Apple disponible à l’ adresse suivante : https://developer.apple.com/library/mac/samplecode/OpenCL_Hello_World_Example/Listings/ReadMe_txt.html.

Vous remarquerez dans le code ci-dessus qu’un tableau de flottants est copié sur le périphérique. Pourquoi cela n’a-t-il pas besoin d’être un tableau de cl_floats? La mémoire est directement copiée, non? Que se passe-t-il si votre hôte float et celui de l’appareil ne sont pas de la même taille?

Pouvez-vous expliquer pourquoi il n’est pas nécessaire d’utiliser cl_float? Si ce n’est pas nécessaire dans ce cas, alors quand les types opencl doivent -ils être utilisés?

Le point entier de ces types cl_ cl_ est qu’ils sont définis avec la même taille sur l’hôte et le périphérique par le moteur d’exécution OpenCL. En pratique, pour les types simples tels que float vous pouvez souvent vous en passer sans utiliser cl_float (car float et cl_float ont souvent la même taille), mais il est toujours recommandé d’utiliser les types cl_ cl_ pour une portabilité maximale. Comme indiqué dans les commentaires (merci @DarkZeros), un bon exemple d’un type pouvant poser problème est un int , car sa taille peut varier en fonction de la plate-forme hôte. L’utilisation de cl_int signifie que ce n’est pas un problème.

Comme indiqué dans la documentation que vous avez liée à, OpenCL C est basé sur C99 avec des extensions et des ressortingctions spécifiques (je l’ai entendu décrire comme un “supersubset” :-). En plus de vous assurer que les tailles de vos types correspondent, vous vous size_t également à utiliser des types définis dans OpenCL C ( size_t n’a pas de correspondance pour cl_size_t , par exemple).

En termes de votre exemple, les tampons ont la même taille que les lectures et les écritures en cours d’exécution, mais le problème potentiel est que le périphérique peut avoir un type float taille différente, de sorte que vos kernelx peuvent potentiellement utiliser des valeurs parasites. Je changerais toutes les occurrences de float en cl_float pour se prémunir de cette possibilité.