Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.matlab

Topic: histc for gpu
Replies: 3   Last Post: Feb 20, 2014 8:39 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Edric Ellis

Posts: 694
Registered: 12/7/04
Re: histc for gpu
Posted: Jan 27, 2014 5:06 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

"Christian " <proechri@umich.edu> writes:

> 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:

%%%%%%%%%%%%%%%%%%%%
function test()

% Test inputs
q = gpuArray.randi([1 10], 1, 1000);
edges = 1:8;

% 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
%%%%%%%%%%%%%%%%%%%%

Cheers,

Edric.



Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.