Я пытался ускорить реализацию Mandrellbrot с использованием OpenCl через PyOpenCl. У меня теперь есть некоторые странные проблемы с производительностью с Intel OpenCl по сравнению с AMD APP. Я использую Ubuntu 14.10 на HP Elitebook 840 G1 с Intel Core i7-4600U.Увеличение производительности после ошибки в PyOpenCl с Intel OpenCl
Основная часть является функцией для вычисления числа итераций для данной точки на сетке (изображение) является:
platforms = cl.get_platforms()
devs = platforms[1].get_devices(device_type=cl.device_type.CPU)
def Mandelbrot(xmin, xmax, ymin, ymax, xsize, ysize, maxit, col, image):
ctx = cl.Context(devices = devs)
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
output_opencl = cl.Buffer(ctx, mf.WRITE_ONLY, image.nbytes)
dx = (xmax - xmin)/xsize
dy = (ymax - ymin)/ysize
prg = cl.Program(ctx,code).build()
prg.mandelbrot(queue, (xsize, ysize), None, np.float64(xmin), np.float64(ymax),
np.float64(dx), np.float64(dy), np.uint16(maxit), np.uint16(col), output_opencl)
cl.enqueue_copy(queue, image, output_opencl).wait()
Здесь platforms[0]
бы быть AMD APP и platforms[1]
является Intel OpenCL, устройство является Core i7 оба раза. code
будет ядром, написанным в OpenCl C.
Использование Core i7 на AMD APP Эта функция работает с частотой около 0,075 для изображения с разрешением 1024x1024 с глубиной итерации 200. Использование Intel OpenCl составляет около 0,25 с , что неожиданно, так как Intel OpenCl обычно лучше работает с Core i7.
Теперь я получаю странное поведение. Если я позволю программе завершить ошибку, изменив что-нибудь в функции Mandelbrot
(например, любой синтаксис, аргументы), запустите ее в консоли IPython и получите сообщение об ошибке, исправьте ошибку и запустите ее снова, а затем производительность на Intel OpenCl увеличивается до 0,045 с (коэффициент 5-6). После этого производительность всегда лучше, чем с AMD APP, пока я не перезапущу консоль IPython. Если я запускаю программу в командной строке, используя python3 file.py
, производительность плоха. Он работает только в том случае, если я позволяю ему запускаться в той же самой консоли IPython, сначала заканчивая какой-либо ошибкой, а затем правильный ...
Я действительно не знаю, что может вызвать такую странную ошибку. Скорее всего, какая-то ошибка с исполняющей Intel OpenCL, хотя я не знаю, где начать смотреть ...
Большое спасибо
Какой у вас выбор времени? Это целая функция Мандельброта или просто вычисление? – jprice
Вся функция «Мандельброт», которая включает в себя создание контекста и всего и фактическое вычисление. – somebody