Я использую OpenCV для приложения в области компьютерного зрения. Я хотел бы ускорить некоторые матричные операции, (матрицы довольно большие )на графическом процессоре, и хочу по возможности избежать кодирования непосредственно в CUDA C. OpenCV 2.4.1 имеет ряд функций с ускорением на GPU. Насколько хорошо они работают в вашем опыте? Мне лучше использовать другую библиотеку (, например. Толчок )вместо этого?
РЕДАКТИРОВАТЬ Образец заявления:Вычислить квадрат матрицы евклидовых расстояний на графическом процессоре . В настоящее время моя реализация с GPU-ускорением (и векторизацией )в Matlab с использованием Parallel Computing Toolbox (PCT )примерно в 5 -10 раз быстрее, чем моя реализация на C++ с OpenCV.
Реализация Matlab:
function K = sqEuclideanDist(P_cpu,Q_cpu)
% Vectorized method to compute pairwise squared Euclidean distance on GPU
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))
P_gpu = gpuArray(P_cpu);
Q_gpu = gpuArray(Q_cpu);
[nP, d] = size(P_gpu);
[nQ, d] = size(Q_gpu);
pmag = sum(P_gpu.* P_gpu, 2);
qmag = sum(Q_gpu.* Q_gpu, 2);
% note that K is on GPU
K = ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P_gpu*Q_gpu';
end
ОБНОВЛЕНИЕ Вот еще одна реализация Matlab, которая выполняет то же самое (благодаряhttps://stackoverflow.com/a/7774323/1121420). Но он работает только на процессоре, потому что bsxfun
не поддерживается PCT. Тем не менее, все еще ищет альтернативу С++.
function K = sqEuclideanDist(P_cpu,Q_cpu)
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))
% Runs on CPU only.
K = bsxfun(@plus,sum(p.^2,2),sum(q.^2,2)') - 2*(p*q');
end