J'essaie d'évaluer des points dans un grand polynôme parcellaire, qui est obtenu à partir d'une spline cubique. J'essaye de faire ceci sur un GPU et je cours dans des limitations de mémoire. En tant que tel, je voudrais évaluer un polynôme par morceaux par lots.Évaluation par lots de polynômes par morceaux sur GPU
Code d'origine:
Y = some_matrix_of_data_values ;
X = some_vector_of_data_sites ;
pp = spline(X, Y) ; % get the piecewise polynomial form of the cubic spline. The resulting structure is very large.
for t = 1: big_number
hcurrent = ppval(pp,t); %evaluate the piecewise polynomial at t
y(t) = sum(x(t:t+M-1).*hcurrent,1) ; % do some operation of the interpolated value. Most likely not relevant to this question.
end
vectorisé, nous l'espérons sur le chemin de traitement par lots GPU:
Y = some_matrix_of_data_values ;
X = some_vector_of_data_sites ;
pp = spline(X, Y) ; % get the piecewise polynomial form of the cubic spline. Resulting structure is very large.
batchSize = 1024 ;
for tt = 1: batchSize: big_number
if tt > big_number - batchSize % snatch up any remaining values at the end of the loop, and calculate those as well
batchSize = big_number - tt ;
end
hcurrent = ppval(pp ,(tt:tt+batchSize-1)) ; %evaluate pp at a couple of data sites
ind = bsxfun(@plus, 1:M, (tt-1:1:tt+batchSize-2).')) ; %make an index matrix to help with next calculation. Most likely not relevant to this question.
y(tt:tt+batchSize-1) = sum(x(ind).*hcurrent' , 2) ; % do some calculation, but now we have done it in batches!
end
Dans le code révisé, le polynôme par morceaux est évalué à plusieurs sites de données, donc nous sommes au moins sur notre chemin là-bas. Le polynôme par morceaux pp
est trop volumineux pour être stocké sur le GPU. Y a-t-il un moyen de le décomposer pour le traitement par lots?