В продолжение к предыдущему посту, как пример параллельного языка который мог бы неплохо лечь на GPU (с серьезными изменениями конечно) -- ZPL.
Намного более дружественный синтаксис чем у APL (не нужна специальная клавиатура :), и даже чем у его диалектов J и K.
Выглядит вот так:
region R = [1..n, 1..n ]; RowVect = [ * , 1..n ]; ColVect = [ 1..m, * ]; var M: [ R ] double; V: [ RowVect ] double; S : [ ColVect ] double; [ ColVect ] S := +<<[R ] (M * V);
Замечательное введение в ZPL в комиксах можно смотреть тут.
В общем-то влияние APL на него чувствуется весьма, жалко в отличие от J он функциональным таки не является.
Зато есть функциональный язык NESL, умножение матрицы на вектор на нем выглядит вообще довольно непримечательно для тех кто видел какой-нибудь непараллельный функциональный язык:
sum({v * x[i] : (i,v) in row});
Что неудивительно, поскольку любой функциональный язык, все эти filter'ы и map'ы просто так и просят чтоб их распараллелили.
Ну и естественно Data Parallel Haskell наше все:
smvm sm vec = [: sumP [:x * (vec!:col)|(col, x)<-row :]|row<-sm:]
2 comments:
Спасибо за ссылки.
Вот еще в копилку для полноты картины (хотя проект, похоже, мертв):
FISh
Q (k4) тоже умеет параллелиться:
The "parallel each" adverb is used for parallel execution of a function over data.
In order to execute in parallel, q must be started with multiple slaves (-s).
Post a Comment