我的代码在各种gpuArrays ismember(A,B)
和2^20
上调用A
一些B
次,其中A
是一个非稀疏矩阵,数百万具有排序行和B
的整数条目是几千个不同整数条目的非稀疏排序向量。如果有帮助,可以使用线性索引A(:)
进行排序。
对于有序(整数)非gpu数组,最快的选项是builtin('_ismemberhelper',a,b)
,ismembc
较慢,两者都比ismember
快得多(因为它们省略了所有检查),无法使用gpuArrays操作,并且仍然比gpuArrays上的ismember
慢。也就是说,就速度而言:
ismember on GPU > builtin('_ismemberhelper',a,b) > ismembc() > ismember on CPU
现在,我查看了主ismember.m
文件以查看它使用的代码,但我能找到的相关内容是:
else %(a,b, are some other class like gpuArray, syb object)
lia = false(size(a));
if nargout <= 1
for i=1:numelA
lia(i) = any(a(i)==b(:)); % ANY returns logical.
end
else
for i=1:numelA
found = a(i)==b(:); % FIND returns indices for LOCB.
if any(found)
lia(i) = true;
found = find(found);
locb(i) = found(1);
end
end
end
end
(代码中其他看似相关的部分使用的函数如unique
和sortrows
,它们不支持gpuArrays。)这肯定不仅适用于gpu加速代码,但它也是,正如预期的那样,甚至没有接近gpuArrays的ismember
性能。因此:
(问题1) GPU加速版ismember
的例程是否可以公开访问(如ismember.m
)?
(问题2)更重要的是,对于我的特定情况(上述大小的排序整数值数组),是否存在比GPU加速的成员更快的函数/算法。 / p>
我目前正在使用MATLAB 2014b和GTX 460以及1 GB的VRAM。