strfind on gpu
3 views (last 30 days)
Show older comments
Hi there, When I try to use strfind on data which is on the gpu it gives me an error. It seems strfind cannot work on data which is on the gpu. Is there a work around?.
7 Comments
Daniel Shub
on 24 May 2012
@Jan the STRFIND function also "works" for numeric inputs, although with the obvious problems associated with floating point comparisons.
Accepted Answer
Daniel Shub
on 24 May 2012
The STRFIND function is fast to find the occurrences of a sequence. The problem is that you are calling it for all possible sequences, even though I think you are only interested in using it on sequences that repeat. It is easy and quick to find repeated sequences:
First create some data that I can run quickly on my laptop
M = 1e6;
N = 6;
k = 100;
x = randi(k, 1, M);
First you need to reshape the data to get every N element sequence
y = zeros(M-N, N);
for ii = 1:(M-N)
y(ii, :) = x((0:(N-1))+ii);
end
Then find all the unique N element sequences.
[a, b, c] = unique(y, 'rows');
Some of these sequences will occur only once and we want to remove these
temp = c;
temp(b) = [];
a = a(unique(temp));
then instead of looping over every possible sequence you can do
for ii =1:size(a, 1)
strfind(x, a(ii, :));
end
I am not even sure this last step is needed since the information may already be available in "c".
I have no idea if this is faster.
0 Comments
More Answers (5)
Jill Reese
on 21 May 2012
gpuArray currently only supports full, numeric types, so you cannot store a string on the GPU. How are you trying to call strfind?
Daniel Shub
on 21 May 2012
I think I lead you to use STRFIND in my answer to this question where I pointed to Loren's blog. If you look at that blog post again, she states that strfind is not the fastest solution when the arrays get big. You might be better off using another one of her solutions because they are faster and at first glance seem to be GPU compatible.
Mate 2u
on 24 May 2012
4 Comments
Daniel Shub
on 24 May 2012
From some of your other questions it is not clear to me if in the real application the "prices" are binary (or small integers) or if they are doubles.
Daniel Shub
on 24 May 2012
Based on your comment "the string is Diff of prices....so are all in decimals...eg 0.0012 0.0001 -0.0002 etc" I would point out that using STRFIND on floating point number is a BAD IDEA. See FAQ:6.1 as to why comparing floating point numbers is in general a bad idea.
Jon Lareau
on 3 Jun 2023
If you want to run on a GPU you can convert your strings to matrix of uint8 char values. You will need to build your GPU compiant processing function to work with the integer ASCII representation of the chars in the string.
A = uint8(char(my_string_array));
result = some_gpu_enabled_function(gpuArray(A));
1 Comment
Walter Roberson
on 3 Jun 2023
This is not wrong, but in context it is not relevant.
strfind() allows numeric inputs. For example
mask = A(:)>2; strfind([0;mask].', [0 1 1 1])
would search A looking for each place that a run of at least 3 values in a row are greater than 2.
The question was not about characters, it was about using a pattern matching function that happens to have "str" at the beginning of its name.
See Also
Categories
Find more on GPU Computing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!