web-dev-qa-db-fra.com

Installer OpenCL / Pyopencl sur Ubuntu 14.04

Il y a beaucoup d'instructions sur la façon de faire fonctionner OpenCL sur Ubuntu, mais toutes sont obsolètes (> 4 ans) ou ne fonctionnent tout simplement pas.

Existe-t-il un didacticiel en cours sur l’utilisation de CL ouvert sur Ubuntu (14.04 ou 15.04)?

J'ai essayé de suivre les instructions this mais je me demande s'il est préférable d'installer à partir d'un * rpm converti, car cela semble être un peu un hack.

3
Dschoni

Si vous souhaitez coder sur votre CPU/GPU, le guide AMD est probablement un bon point de départ. Pour que les pilotes OpenCL fonctionnent sur un ordinateur équipé d'un APU/GPU AMD, il vous suffit d'installer le pilote fglrx à partir du centre de logiciel. Pour tester son fonctionnement et écrire du code, vous pouvez également utiliser le kit de développement logiciel AMD APP.

J'ai utilisé la version 3.0 du SDK du site AMD . Le guide d'installation est ici . Une fois que vous l'avez, vous pouvez suivre leur guide de programmation .

Voici l'un des premiers exemples modifiés pour simplement imprimer le nombre d'unités de calcul sur le processeur graphique de votre ordinateur:

            //
            // Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
            // Modified by Aedazan for learning purposes.
            // Uploaded as fair use teaching material 17 U.S. Code § 107.
            // A minimalist OpenCL program.
            #include <CL/cl.h>
            #include <stdio.h>

            #define NWITEMS 512


            // A simple memset kernel

            //const char *source = "__kernel void memset( __global uint *dst ) \n" "{ \n" " dst[get_global_id(0)] = get_global_id(0);  \n" "} \n";
            const char *source = "__kernel void memset( __global uint *dst ) " "{ " " dst[get_global_id(0)] = get_global_id(0)*get_global_id(0);" 
            ""
            "\n" "} \n";


            int main(int argc, char ** argv)
            {
            // 1. Get a platform.
            cl_platform_id platform;
            clGetPlatformIDs( 1, &platform, NULL );
            // 2. Find a gpu device.
            cl_device_id device;
            cl_uint compute_units;
            clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,1,&device,NULL);
            clGetDeviceInfo( device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &compute_units, NULL);
            printf("Compute units: %d\n", compute_units);

            // 3. Create a context and command queue on that device.
            cl_context context = clCreateContext( NULL, 1, &device, NULL, NULL, NULL);
            cl_command_queue queue = clCreateCommandQueue( context, device, 0, NULL );
            // 4. Perform runtime source compilation, and obtain kernel entry point.
            cl_program program = clCreateProgramWithSource( context, 1, &source, NULL, NULL );
            clBuildProgram( program, 1, &device, NULL, NULL, NULL );
            cl_kernel kernel = clCreateKernel( program, "memset", NULL );
            // 5. Create a data buffer.
            cl_mem buffer = clCreateBuffer( context, CL_MEM_WRITE_ONLY, NWITEMS * sizeof(cl_uint), NULL, NULL );

            // 6. Launch the kernel. Let OpenCL pick the local work size.
            size_t global_work_size = NWITEMS;
            clSetKernelArg(kernel, 0, sizeof(buffer), (void*) &buffer);
            clEnqueueNDRangeKernel( queue,
            kernel,
            1,
            NULL,
            &global_work_size,
            NULL, 0, NULL, NULL);
            clFinish( queue );
            // 7. Look at the results via synchronous buffer map.
            cl_uint *ptr;
            ptr = (cl_uint *) clEnqueueMapBuffer( queue, buffer, CL_TRUE, CL_MAP_READ, 0, NWITEMS * sizeof(cl_uint), 0, NULL, NULL, NULL );
            int i;
            for(i=0; i < NWITEMS; i++)
            //printf("%d %d\n", i, ptr[i]);
            return 0;
            }

Vous pouvez le compiler avec la ligne suivante. Cela suppose que vous avez installé le SDK en tant que root dans les emplacements par défaut.

gcc -o computec.bin -I /opt/AMDAPPSDK-3.0/include/ -L /opt/AMDAPPSDK-3.0/lib/x86_64/ test.c -lOpenCL
2
Aedazan

Nous avons mis à jour notre article tous les ans, il devrait donc continuer à fonctionner. Oui, vous devriez "alien" le rpm pour l'obtenir sur Ubuntu.

0
VincentSC