Установите OpenCL/Pyopencl на Ubuntu 14.04
Существует множество инструкций о том, как запустить OpenCL в Ubuntu, но все они устарели (>4 года) или просто не работают.
Есть ли какой-нибудь текущий рабочий учебник о том, как запустить открытый CL в Ubuntu (14.04 или 15.04)?
Я пытался следовать этой инструкции, но мне интересно, лучше ли устанавливать с конвертированных * оборотов в минуту, так как это похоже на взлом.
2 ответа
Если вы хотите написать код на своем CPU/GPU, руководство по AMD, вероятно, является хорошим началом. Чтобы заставить драйверы OpenCL работать на компьютере с AMD APU/GPU, вам просто нужно установить драйвер fglrx из центра программного обеспечения. Чтобы проверить его работоспособность и написать код, вы также можете использовать AMD APP SDK.
Я использовал версию 3.0 SDK с сайта AMD. Руководство по установке здесь. Если у вас есть его, вы можете следовать их руководству по программированию
Вот один из ранних примеров, модифицированных, чтобы просто распечатать количество вычислительных блоков на вашем компьютере GPU:
//
// 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;
}
Вы можете скомпилировать его с помощью следующей строки. Предполагается, что вы установили SDK от имени пользователя root в каталог по умолчанию.
gcc -o computec.bin -I /opt/AMDAPPSDK-3.0/include/ -L /opt/AMDAPPSDK-3.0/lib/x86_64/ test.c -lOpenCL
Мы обновляли нашу статью ежегодно, поэтому она должна работать. Да, вы должны "чуждо" RPM, чтобы получить его на Ubuntu.