Thursday, June 06, 2013

Как запустить программу без операционной системы: часть 4. Параллельные вычисления

После долгого перерыва продолжаем делать интересные штуки, как всегда на чистом железе без операционной системы. В этой части статьи научимся использовать весь потенциал процессоров: будем запускать программу сразу на нескольких ядрах процессора в полностью параллельном режиме. Чтобы провернуть такое, нам потребуется многое сделать для расширения функциональности программы полученной в части 3. 

Просто так выполнять какие-то вычисления на ядрах процессора – скучно, поэтому нужна задача, которая требует больших вычислительных ресурсов, хорошо раскладывается на параллельные вычисления, да и выглядит прикольно. Предлагаем сделать программу, которая рендерит простенькую 3D-сцену, используя алгоритм обратной трассировки лучей, или, по-простому, Ray Tracing. 

...
...
Теперь, когда с теорией покончено, приступим к написанию программы.

! ВАЖНО!: Все дальнейшие действия могут успешно осуществляться только после успешного прохождения всех 6-ти шагов из третей части статьи "Как запустить программу без операционной системы" 

Шаг 1. Сперва чистим лишнее.

В первую очередь нужно немного очистить имеющийся код от лишних файлов и функций. Нам понадобится полноценная математическая библиотека, поэтому нужно удалить лишние файлы из common: удаляем файл common/s_floor.c . 
Рисовать фрактал нам не нужно – нам нужен Ray Tracing, поэтому можно удалить fractal.c. Но поскольку графический режим все же нужен, пишем следующий код в kernel.c:

1. добавляем несколько объявлений перед функцией main, которые в том числе задают разрешение экрана и картинки, которую будем рендерить:

int vbe_screen_w = 800, vbe_screen_h = 600;
int VBE_SetMode( ulong mode );
int VBE_Setup(int w, int h);
extern ulong vbe_lfb_addr;
extern ulong vbe_selected_mode;
extern ulong vbe_bytes;
//Про них будет написано позднее
int ray_main();
void SmpPrepare(void);


2. меняем функцию main:

void main()
{   
    clear_screen();
    printf("\n>>> Hello World!\n");

// Будет включать все ядра процессора
    SmpPrepare();
    VBE_Setup(vbe_screen_w, vbe_screen_h);
    VBE_SetMode(vbe_selected_mode | 0x4000);    
// Будет инициировать рисование на экране
    ray_main(); 
}


3. удаляем строку:

void DrawFractal(void);


Шаг 2. Добавляем математическую библиотеку fdlibm.

Теперь можно добавить полноценную математическую биьлиотеку. На самом деле нам понадобятся только функции sqrt, tan и pow – они используются в алгоритме Ray Tracing.

Read more: Habrahabr.ru
QR: Inline image 1