ironpeter хотел Хаскеля, но есть вещь попроще.

May 05, 2007 18:40

Есть такая штука - GPGPU.

Одним из вариантов этого GPGPU является язык BrookGPU - вариант языка Brook с расчетом его использования вместе с видеоускорителями.

Идея языка проста и называется она stream-kernel. Мы простыми функциями которые называются kernel обрабатываем данные, уложенные в stream. В случае с GPU kernel должен быть транслируем в шейдеры и данные находятся в текстурах.

Как выглядит kernel:
kernel void sumalpha(float arga<>,float argb<>,float alpha,out float result<>) {
result = arga*alpha+argb*(1-alpha);
};arga, argb и result - stream, потоки. В нашем ядре sumalpha мы складываем их поэлементно с "прозрачностью" alpha. alpha - это параметр ядра.

Вызов тоже прост:
...
float a<100>, b<100>;
... иннициализация a и b ...
float res<100>;
float alpha = ...;
sumalpha(a,b,alpha,res);В принципе, ко входным потокам мы можем адресоваться произвольно instream[i,j], но на выходе результат пишется в текущую точку выходного потока (выходных потоков). Ее можно определить с помощью функции indexof(stream).

Что для всего этого есть: сортировка на GPU со сложностью O(Nlog²N) (bitonic sort), трассировка лучей. Это все есть в примерах.

Определенный минус всего этого дела - заточенность под хардвару, конкретно, под GPU. Даже целые числа конвертируются из (в) float.

Сама штука представляет собой компилятор с оного BrookGPU в C++ и систему поддержки времени исполнения.

Мне идея нравится. Она проста и достаточно элегантна.

Для того же Cell ее можно слегка улучшить - Cell имеет лучший интерфейс к памяти процессора, чем GPU, поэтому ту же трассировку лучей получится сделать значительно быстрее, не надо будет перекодировать деревья в текстуры, достаточно добавить обмен с памятью процесса. Соответственно, вместо загадочного aKDTreeStream[i].x можно использовать нормальный aKDTreePtr->splitCoord.

Вот. ;)

Если что, мы в прошлом году это дело обсасывали достаточно подробно.

видеоускорители, gpgpu, cell

Previous post Next post
Up