Vectorised a nested conditional function for gpuarray & arrayfun

6 vues (au cours des 30 derniers jours)
Sendy Phang
Sendy Phang le 9 Oct 2014
Hi, I have a class which has many arrays and a nested functions.
The goal is I want to make all the arrays as gpuarray and use arrayfun, to be run in GPU, thus I'd like to have them well vectorised. Any thought? Thanks
%%the class
classdef egclass < handle
properties
cond = [1 1 1 0 0];
x = [10 20 30 40 50];
y = [0 0 0 0 0];
out= [0 0 0 0 0];
end
end
%%the function
function doOperation(eg)
[nR,nC] = size(eg.cond);
%%need to be vectorised!!!
for i = 1:nC
if eg.cond(i) == 0
doTimes(eg,i);
end
if eg.cond(i) == 1
doAdd(eg,i);
end
end
end
function doTimes(eg,i)
eg.out(i) = eg.x(i) * eg.y(i);
end
function doAdd(eg,i)
eg.out(i) = eg.x(i) + eg.y(i);
end
%%debug.m
clear all; clc;
eg = egclass;
doOperation(eg);

Réponse acceptée

Daniel Simmons
Daniel Simmons le 10 Oct 2014
Hi Sendy,
If you're trying to use arrayfun to pass the arrays to the GPU inside the class, this is no problem! Just use this as your member function:
function doOperation(eg)
gpu_x = gpuArray( eg.x );
gpu_y = gpuArray( eg.y );
gpu_cond = gpuArray( eg.cond );
eg.out = arrayfun( @doAddOrTimes, gpu_cond , gpu_x, gpu_x );
end
where the "doAddOrTimes" function will incorporate the "if" statement. Of course, this function, and any others used on the GPU, will have to be an external function with no class attributes. As far as I'm aware, manipulating classes on the GPU is not possible.
Dan

Plus de réponses (0)

Catégories

En savoir plus sur GPU Computing dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by