Matlab:将相同的GPU功能并行应用于多个向量

时间:2013-11-21 20:00:47

标签: matlab parallel-processing gpgpu

我正在尝试使用Matlab做一个天真的GPU并行实现K-最近邻居(即我现在试图避免去CUDA)。假设我有一个功能

idx=MyKnn(A,x,k)

计算距离x最小的A的k行的索引。我们将A视为N-by-d矩阵,即d维中的N个向量。 x是单个d维向量。

现在,假设我有两个(或更多)向量x和y,我想计算MyKnn(A,x,k)和MyKnn(A,y,k)(同时查询相同的数组A)。难道我不能在GPU上并行运行吗? Matlab有arrayfun()方法,用于将相同的函数应用于数组的每个元素,但是如何应用相同的函数来表示数组的每个行或列

如果“使用for循环”是最好的答案,那很好 - 这就是我现在所做的,看起来我应该能够更加平行一点。

1 个答案:

答案 0 :(得分:1)

我一直在考虑这个问题,所以我会对它进行一次尝试,尽管我没有100%的回答。我有很多在CUDA,Matlab和MEX工作的经验,虽然我没有使用您可能正在使用的并行计算工具箱的GPU部分的经验。

直接回答您的问题:使用cellfun代替arrayfun来获取您正在考虑的行为。显然,你需要重新索引到单元格中。

答案越长,我认为这不会有所帮助。如果你在它上面花了很多周期,你应该尝试一下,看看它有什么用,但这是我的理由:我将假设你的MyKnn函数看起来像这样:

t = bsxfun(@plus, A, -d);
distSq = sum(t .* t, 2);
[ignore, bestKs] = sort(distSq);
idx = bestKs(1:k);

对于小k,您可以使用专门的函数对排序进行分类(例如,您可以编写一个在O(kN)时间而不是O(N log N)时间内运行的简单函数。

对于这种实现,假设您的N相当大(例如,10,000或更大),从并行中获得的优势并不太多,因为函数内部已经有足够的向量化。我会坚持使用for循环。

总的来说,我会说尽管GPU提供了大量的并行性,但GPU中的数百个并发线程中的每一个都非常简单,因此您不能将每个线程分配给单独的MyKnn任务。如果我直接在CUDA中写这个,我会让GPU一次只能处理一个MyKnn(同样,假设N很大)。