> Path: news.mathworks.com!not-for-mail > Newsgroups: comp.soft-sys.matlab > Subject: histc for gpu > Date: Sat, 25 Jan 2014 21:28:07 +0000 (UTC) > Organization: The MathWorks, Inc. > > Hi, > > I hope to use histc on CUDA, but it's not a supported function. So I tried a workaround because I'm actually just interested in the second output argument: > > [~,ind] = histc(x,x_grid); > > is more or less equivalent to the following code (except for points outside the grid). > > ind=ones(size(x)); > for j=1:length(x_grid)-1 > ind(x>=x_grid(j) & x<x_grid(j+1)) = j; > end > > But this latter code is much slower than histc, probably due to the loop. For instance, for my inputs the first code requires 0.03 seconds, the latter needs 1.8 seconds. > > Is it possible to speed up the second code so that I can still run it > on CUDA?
I haven't profiled this, but you can run just the binning part of HISTC on the GPU using arrayfun and up-level variables to access the bins:
% Implementation nEdges = numel(edges); function b = bindata(x) b = 0; if x == edges(nEdges) b = nEdges; else for idx = 1:(nEdges-1) if x >= edges(idx) && x < edges(idx + 1) b = idx; break; end end end end b = arrayfun(@bindata, q);
% Check against the CPU [~, bcheck] = histc(gather(q), edges); assert(isequal(b, bcheck)); end %%%%%%%%%%%%%%%%%%%%