对于排序整数gpuArrays,是否有更快的MATLAB ismember()?

时间:2015-05-27 11:12:24

标签: matlab gpgpu binary-search

我的代码在各种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

(代码中其他看似相关的部分使用的函数如uniquesortrows,它们不支持gpuArrays。)这肯定不仅适用于gpu加速代码,但它也是,正如预期的那样,甚至没有接近gpuArrays的ismember性能。因此:

(问题1) GPU加速版ismember的例程是否可以公开访问(如ismember.m)?

(问题2)更重要的是,对于我的特定情况(上述大小的排序整数值数组),是否存在比GPU加速的成员更快的函数/算法。 / p>

我目前正在使用MATLAB 2014b和GTX 460以及1 GB的VRAM。

0 个答案:

没有答案