Premier pas sur OpenCL : Mon PC est-il compatible ?

OpenCL est une API portable permettant de faire du calcul parallèle sur Carte Graphique ou Processeur. Il y a donc de grandes chances que votre PC supporte OpenCL.

Les processeurs Intel supportent OpenCL depuis la première génération des processeurs i3/i5/i7/Extreme, mais le support d’OpenCL sur les processeurs graphiques Intel HD Graphics est apparu avec la 3ème génération d’i3/i5/i7/Extreme.

Quelques bases sur l’API

Types scalaires

Comme toute API portable, OpenCL utilise ses propres types scalaires. Le premier que vous rencontrerez est cl_int qui est un entier. Suivant la plateforme visée, il utilisera le type natif.

Pour cl_int nous attendons donc un entier sur 32 bits que ce soit sur Windows ou toute autre plateforme :

#if (defined (_WIN32) && defined(_MSC_VER))
[…]
typedef signed __int32 cl_int;
[…]
else
typedef int32_t cl_int __attribute__((aligned(4)));

 

Vous pourrez trouver tous les types scalaires dans le fichier cl_platform.h ([…]\OpenCL SDK\3.0\include\CL) ou la documentation (http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/scalarDataTypes.html).

Classes de base

OpenCL est utilisable en C et C++. La partie C++ est bien évidement un wrapper autour de l’API en C, nous retrouvons donc les types scalaire au sein des paramètres et retours de méthodes.

La première classe que nous utiliserons est cl::Platform.

Cette classe est la base de tout programme utilisant OpenCL, elle permet de récupérer les devices (CPU ou GPU), compiler les fichiers OpenCL et lancer l’exécution.

La seconde classe que nous verrons est cl::Device.

Cette classe permet de récupérer tous les devices supportant OpenCL sur votre machine et doit être utilisée pour exécuter le code OpenCL.

Defines de base

La plupart des méthodes permettent de savoir si une erreur s’est produite, que ce soit en retour de méthode ou en out parameter (via référence).

Les erreurs sont de types cl_int, et des defines permettent de savoir quel type d’erreur s’est produite.

#define CL_SUCCESS 0
#define CL_DEVICE_NOT_FOUND -1
#define CL_DEVICE_NOT_AVAILABLE -2

Vous pourrez trouver tous les defines dans le fichier cl.h ([…]\OpenCL SDK\3.0\include\CL).

Vérifier si notre CPU/GPU supporte OpenCL

Récupération de la Platform

La première étape est de récupérer la cl::Plartform afin de récupérer les devices.

std::vector<cl::Platform> platforms;
cl_int status = cl::Platform::get(&platforms);
if (status != CL_SUCCESS)
{
    std::cout << "Error: Getting platforms" << std::endl;
    return EXIT_FAILURE;
}

Récupération des Devices

Nous récupérons ensuite la liste des devices supportants OpenCL.

error = platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices);

Cette simple ligne permet de récupérer tous les types de device supportant OpenCL (que ce soit GPU ou CPU).

Dans cl.h vous trouverez les autres defines que vous pouvez passer en paramètre à getDevices :

CL_DEVICE_TYPE_DEFAULT //default OpenCL device
CL_DEVICE_TYPE_CPU //OpenCL device that is the host processor
CL_DEVICE_TYPE_GPU //OpenCL device that is a GPU
CL_DEVICE_TYPE_ACCELERATOR //Dedicated OpenCL accelerators
CL_DEVICE_TYPE_CUSTOM //Dedicated accelerators that do not support programs written in OpenCL C
CL_DEVICE_TYPE_ALL //All OpenCL devices available in the system

Récupération des infos

Nous allons maintenant récupérer le nom de chaque device supportant OpenCL, ainsi que la version d’OpenCL supportée.

for (int i = 0; i < devices.size(); ++i)
{
    auto ret = devices[i].getInfo<CL_DEVICE_NAME>();
    std::cout << ret << std::endl;

    ret = devices[i].getInfo<CL_DEVICE_VERSION>();
    std::cout << ret << std::endl;
}

La méthode template getInfo permet de récupérer une info à la fois (dans notre cas le nom du device et la version d’OpenCL).

D’autres defines permettent d’avoir des infos encore plus précises, comme des tailles mémoire, support du little endian, etc.

Vous trouverez tous ces defines dans dans la documentation (http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html).

Téléchargement sources et références

Sources : https://github.com/littlebigben 

Intel SDK for OpenCL* Applications 2013 : http://software.intel.com/en-us/vcsource/tools/opencl-sdk 

Documentation OpenCL : http://khronos.org/OpenCL

Intel SDK for OpenCL* Applications 2012 Release Notes : http://software.intel.com/en-us/articles/opencl-release-notes/

Prochain article

Pour le prochain article nous verrons comment compiler et exécuter une fonction OpenCL.

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.