Программирование высокопроизводительных приложений на процессоре Cell BE, Часть 1: Введение в Linux на PLAYSTATION 3

Краткий обзор, установка и первые шаги в программировании

Sony® PLAYSTATION® 3 (PS3) – самый простой и дешевый для программистов способ достать и опробовать новый процессор Cell Broadband Engine™ (Cell BE). Мы рассказываем, что это такое, как установить Linux® на PS3 и как начать разработку для процессора Cell BE на PS3.

Джонатан Бартлетт, технический директор, New Media Worx

Джонатан Бартлет (Jonathan Bartlett) является автором книги "Программирование с нуля" - введения в программирование на языке ассемблера для Linux. Он является ведущим разработчиком в New Media Worx и занимается Web-приложениями (видео, киосками), а также настольными приложениями для клиентов. Вы можете связаться с ним по адресу johnnyb@eskimo.com.



04.09.2007

PLAYSTATION 3 – необычная игровая консоль по двум причинам. Во-первых, она является поразительно открытой, гораздо более, чем любая из предшествующих консолей. В то время как в большинстве консолей делается все возможное, чтобы воспрепятствовать недозволенным играм работать на их системе, PS3 идет в другом направлении, даже обеспечивая прямую поддержку для инсталляции и загрузки чужих операционных систем. Конечно, многие игровые функции, такие как ускорение видео, для сторонних операционных систем заблокированы, но эта серия статей главным образом посвящена более общим и научным приложениям.

Настоящим сокровищем PS3 является процессор Cell Broadband Engine (который часто называют просто Cell BE). Архитектура Cell BE коренным образом отличается от традиционной конструкции процессоров. На кристалле Cell BE расположены девять обрабатывающих элементов (заметим, что в PS3 один из них не работает, а еще один зарезервирован для системных нужд, так что в вашем распоряжении остаются семь обрабатывающих блоков). Основной обрабатывающий элемент – это вполне обычный процессор общего назначения. Это двухпоточный процессор с архитектурой Power Architecture™, называемый Power Processing Element или кратко PPE. Однако остальные восемь элементов – это совсем другая история.

Другие обрабатывающие элементы в Cell BE называются Synergistic Processing Elements или SPE. Каждый SPE состоит из следующих компонентов:

  • Векторный процессор, т.н. Synergistic Processing Unit или SPU
  • Собственная область памяти внутри SPU, т.н. локальная память (local store) (размер этой области в PS3 – 256K)
  • Набор коммуникационных каналов для связи с внешним миром
  • Набор из 128 регистров, каждый по 128 бит (каждый регистр обычно рассматривается как содержащий четыре 32-битных числа одновременно)
  • Контроллер потоков памяти Memory Flow Controller (MFC), который управляет передачами DMA между локальной памятью SPU и основной памятью

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

Поэтому PPE действует как менеджер ресурсов, а процессоры SPE выступают в качестве обработчиков данных. Программы, работающие на PPE, распределяют задачи для выполнения процессорами SPE, и затем они обмениваются данными между собой.

Процессоры SPE, PPE и контроллер основной памяти соединены между собой шиной, получившей название Element Interconnect Bus. Это основной канал, по которому перемещаются данные.

Самое удивительное в этой конструкции – это то, что 256K локальной памяти процессора SPE не являются кэшем, это фактически вся память, которой SPE располагает в каждый конкретный момент времени для работы как с программами, так и с данными. Это кажется недостатком, но в действительности дает ряд преимуществ:

  • Доступ к локальной памяти является чрезвычайно быстрым по сравнению с доступом к основной памяти.
  • Запросы к локальной памяти можно прогнозировать с точностью до одного такта.
  • Перемещение данных в основную память и обратно можно осуществлять в асинхронном режиме и с упреждением.

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

Хотя процессор Cell BE уже некоторое время применяется в специализированном оборудовании, PS3 стала первым недорогим и легко доступным устройством, основанным на Cell BE. А Linux позволяет программировать его всем желающим.

На этом работает Linux? И как его установить?

Для игровых консолей нехарактерно разрешать установку чужих операционных систем. Обычно консоли продаются в убыток и блокируются, чтобы предотвратить исполнение игр, издатели которых не платят лицензионные отчисления производителю консоли. Sony решила немного приоткрыть свою консоль и позволить устанавливать чужие операционные системы, с оговоркой, что они не получат ускоренную графику.

В результате теперь вы можете установить Linux на PS3. Вам придется преодолеть несколько тонких мест, но это определенно работает. Компания Terra Soft Solutions в сотрудничестве с Sony разработала дистрибутив Yellow Dog Linux 5 для PS3. Она даже предлагает, и это пока уникально для дистрибутивов, поддержку при его использовании на PS3. Yellow Dog Linux (сокращенно YDL) с самого начала разрабатывается исключительно для архитектуры PowerPC, так что неудивительно, что Sony заключила контракт на разработку следующей версии YDL специально для PS3.

Ниже приведены инструкции по установке первого выпуска YDL 5 на PS3.

Подготовка PS3

Чтобы установить Linux, вам понадобится следующее дополнительное оборудование:

  • Монитор и соответствующие кабели
  • Клавиатура USB
  • Мышь USB
  • Флэш-накопитель USB

Что касается монитора, есть несколько моментов, на которые необходимо обратить внимание. Во-первых, PS3 с диском 20 ГБ поставляется только с разъемом композитного сигнала RCA для подсоединения к ТВ-подобным устройствам. Его можно превратить в VGA с помощью специального кабеля (см. дополнительную информацию в разделе Ресурсы). К сожалению, разрешение при этом будет всего 576x384. Если вам необходимо лучшее разрешение, следует использовать порт HDMI. Однако это может привести к дополнительным проблемам. HDMI можно легко превратить в DVI с помощью кабеля. Казалось бы, его можно подать на DVI-совместимый монитор. К сожалению, нет. Существует протокол защиты контента под названием HDCP. При выводе через порт HDMI PS3 отказывается передавать данные устройству, не являющемуся HDCP-совместимым. Следовательно, если ваш монитор не является HDCP-совместимым, вы не можете использовать его для цифрового сигнала с PS3 и так и останетесь с разрешением 576x384 (хотя некоторые и сообщают, что им удалось повысить разрешение при использовании компонентного видеовыхода вместо композитного).

Чтобы подготовить PLAYSTATION 3, выполните следующие шаги:

  1. Подключите к PS3 кабель Ethernet. Убедитесь, что в сети есть сервер DHCP.
  2. Если ваша PS3 только что с завода, пройдите все этапы установки, которые система предлагает во время первой загрузки, включая настройки языка, времени и имени пользователя для системы PS3.
  3. Зайдите в Settings, затем в System Settings, и выберите Format Utility.
  4. Выберите Format Hard Disk и дважды подтвердите свой выбор.
  5. Укажите, что вы хотите схему разбиения Custom.
  6. Укажите, что вы хотите Allot 10GB to the Other OS. При этом все остальное дисковое пространство будет автоматически зарезервировано для игровой операционной системы PS3. Когда этот этап завершится, система перезагрузится.
  7. После перезагрузки зайдите в Settings, затем в System Update.
  8. Выберите Update via Internet.
  9. Пройдите процедуру обновления системы, чтобы загрузить и установить последние системные обновления. На некоторых экранах есть только кнопка "cancel", без указаний, как перейти на следующий экран. Чтобы пройти дальше, нажимайте кнопку X на игровом контроллере.
  10. Когда система перезагрузится, она готова к установке Linux.

Подготовка к установке

Теперь надо подготовить Linux. Чтобы подготовиться к установке, выполните на вашем собственном компьютере (не PS3) следующие шаги:

  1. Загрузите из Интернета ISO-образ для YDL 5 и запишите его на DVD. Установка с CD невозможна, PS3 читает только DVD.
  2. Загрузите установщик сторонних операционных систем (PS3 OtherOS Installer) от Sony (см. Ресурсы) и сохраните его как otheros.self. Это файл, который нужно запустить в игровой операционной системе PS3, чтобы установить чужой загрузчик.
  3. Загрузите загрузчик YDL от Terra Soft (снова см. Ресурсы) и сохраните его как otheros.bld. Это будет загрузчик, который установит инсталлятор Sony.
  4. Вставьте USB флэш-накопитель в ваш компьютер.
  5. В корневом каталоге вашего USB-накопителя создайте каталог PS3. Непосредственно в этом каталоге создайте другой каталог с названием otheros.
  6. Скопируйте два скачанных файла, otheros.self и otheros.bld, в каталог PS3/otheros, который вы создали на USB-накопителе.

Теперь приступаем к установке.

Установка

Выполните следующие шаги на PS3 для установки Linux:

  1. Отключите флэш-накопитель от компьютера и вставьте его в PS3.
  2. Зайдите в Settings, затем в System Settings и выберите Install Other OS.
  3. Подтвердите местоположение установщика и пройдите процесс установки. Заметьте, что на этом этапе происходит установка только загрузчика, а не операционной системы.
  4. Когда установщик завершит свою работу, зайдите в Settings, затем в System Settings и выберите Default System. Потом выберите Other OS и нажмите кнопку X.
  5. Вставьте DVD-диск YDL 5.
  6. Подсоедините USB-клавиатуру и мышь.
  7. Теперь перезапустите систему. Это можно сделать, либо держа нажатой кнопку PS на контроллере и выбрав Turn off the system, либо просто удерживая кнопку питания (power) нажатой в течение 5 секунд.
  8. После перезагрузки система будет выглядеть так, как будто загружается Linux. Дело в том, что загрузчик – это в действительности урезанное ядро Linux под названием kboot.
  9. Когда появится приглашение kboot:, наберите install, если монитор подключен через порт HDMI, или installtext, если через аналоговый порт. В дальнейших инструкциях предполагается, что вы используете режим installtext, но разница невелика.
  10. После проверки носителей система может выдать ошибку Traceback error в синей области экрана. Игнорируйте его и продолжайте установку.
  11. Когда вас спросят про разбиение, не бойтесь стереть игровую операционную систему PS3. Режим PS3 Other OS позволяет гостевой операционной системе видеть лишь ее собственную часть диска. Другие части диска не видны даже низкоуровневым утилитам. Так что смело идите вперед и разрешайте YDL стереть все данные на диске, удалить все разделы и создать разбиение по умолчанию.
  12. Когда программа доберется до установки пакетов, на их установку понадобится примерно час. Однако она не станет устанавливать весь DVD.
  13. После перезагрузки, если вы используете аналоговый выход, наберите в приглашении загрузчика kboot: команду ydl480i. Иначе система может изменить выходное разрешение на такое, которое аналоговый выход не поддерживает.
  14. После загрузки появится утилита настройки. Здесь вам нет необходимости что-либо делать. Если вы не станете ничего делать, система подождет некоторое время и закончит загрузку.

Готово! YDL 5 установлена на PS3!

Настройка после установки

К сожалению, инсталляционная программа не заботится обо всех деталях, особенно для аналоговых мониторов. Вам придется предпринять ряд шагов, чтобы настроить такие вещи, как автоматическая загрузка с надлежащим разрешением, конфигурирование X Window System для аналогового видеовыхода и установка Cell BE SDK. Для этого выполните следующие шаги, только убедитесь, что DVD-диск YDL 5 находится в дисководе, и смонтируйте его следующим образом:

mount /dev/dvd /mnt

Во всех дальнейших инструкциях предполагается, что установочный DVD смонтирован именно таким образом, и вы вошли в систему как root.

Чтобы система загружалась с надлежащим разрешением аналогового выхода при запуске, внесите изменения в файл /etc/kboot.conf. Измените строку default=ydl на default=ydl480i и сохраните файл.

Если вы хотите сконфигурировать X Window System для аналогового выхода, установите и запустите пакет Xautoconfig следующим образом:

rpm -i /mnt/YellowDog/RPMS/Xautoconfig-*
Xautoconfig

Теперь можно запустить X Window System командой startx, хотя на аналоговом мониторе экран будет очень маленьким. Вот совет, который поможет работать с таким крошечным экраном: удерживая нажатыми alt и левую кнопку мыши, можно перетаскивать экраны на рабочем столе, даже если их заголовки не видны.

Если вы хотите, чтобы система выводила графический интерфейс входа в систему при загрузке, нужно отредактировать файл /etc/inittab. Измените строку id:3:initdefault: на id:5:initdefault: и сохраните файл. Теперь, когда вы загружаете систему, у вас будет красивый графический экран для входа. Не забудьте после перезагрузки снова смонтировать DVD, как это делалось ранее, для оставшихся шагов настройки. Заметьте, что Nautilus в действительности монтирует его в другое место, так что если вы используете Nautilus для монтирования DVD, он окажется смонтированным в /media/CDROM, а не в /mnt.

Теперь установим Cell BE SDK V2.0. Чтобы определить, не установлен ли он уже установщиком, просто выполните which spu-gcc. Если эта программа не найдена, значит, SDK не установлен. Чтобы установить его, выполните следующие шаги:

cd /mnt/YellowDog/RPMS
rpm -i spu-binutils-* spu-gcc-* spu-gdb-* spu-utils* libspe-devel-*

На DVD отсутствует один важный набор пакетов, а именно 64-разрядная версия libspe, – но это легко исправить. С DVD с исходными файлами или с Web-сайта скачайте SRPM-пакет libspe (он называется libspe-1.1.0-1.src.rpm). Потом перейдите в каталог, куда вы скачали этот пакет, и выполните следующие шаги:

rpm -i libspe-*.src.rpm
cd /usr/src/yellowdog/SPECS
rpmbuild -bb --target ppc64 libspe.spec
cd ../RPMS/ppc64
rpm -i elfspe-* libspe-*

Все готово. YDL 5 инсталлирован, сконфигурирован и готов к работе!

Вы можете задаться вопросом – как вернуться в игровую операционную систему. Для этого введите boot-game-os либо в приглашении kboot: либо в командной строке. Если по каким-либо причинам Linux вызовет ошибку и не будет загружаться, можно загрузить игровую операционную систему, выключив питание PS3 и затем удерживая кнопку питания в течение 5 секунд (пока вы не услышите звуковой сигнал) при включении. Любой из этих методов загрузит игровую операционную систему, но они также сделают игровую операционную систему операционной системой по умолчанию. Теперь, чтобы загрузиться назад в Linux, вам нужно будет возвратиться в параметры настройки и указать загрузку по умолчанию Other OS.


Итак, Linux установлен. Что дальше?

Теперь, когда мы полностью установили Linux и Cell BE SDK, остальная часть этой серии статей будет касаться программирования и использования. В качестве введения предлагаем короткую вводную программу на языке C, которая использует и PPE, и SPE.

Прежде чем рассмотреть, как она работает, рассмотрим некоторые общие инструменты, используемые для создания программ на Cell BE:

  • gcc
    Наш верный компилятор, собранный для генерации бинарных файлов PPC Linux для PPE. Для генерации 64-разрядных исполняемых файлов используйте ключ -m64.
  • spu-gcc
    Это тоже наш верный компилятор, но он генерирует код для процессоров SPE.
  • embedspu
    Специальный инструмент для конвертирования программ SPE в объектные файлы, которые можно скомпоновать в исполняемые файлы PPE. Также он создает глобальную переменную, которая указывает на программе SPE, чтобы PPE мог загружать программу в SPE и запускать ее по мере необходимости. Чтобы включать объектные файлы в 64-разрядные программы для PPC, используйте флаг -m64.

Без процессоров SPE процессор Cell BE по существу программируется так же, как и любая другая система на PowerPC. Фактически вы можете представить себе, что их нет, и ваш код будет прекрасно работать. Однако при этом большая часть ваших вычислительных мощностей окажется неиспользованной. Чтобы использовать возможности процессоров SPE, нужно приложить немного дополнительных усилий.

Если вы еще не освоились с технологией Cell BE, просто помните, что PPE – это диспетчер ресурсов системы. Он исполняет задачи операционной системы, регулирует доступ к памяти и управляет процессорами SPE. Код для PPE обеспечивает инициализацию программы, назначение задач одному или нескольким процессорам SPE и выполнение ввода/вывода. Конечно, PPE также может выполнять задачи обработки, но в общем целесообразно переложить максимум работы на SPE.

Итак, посмотрим, как строится простая программа для выполнения задач обработки на SPE. Программа будет элементарной, она будет вычислять пройденное расстояние по скорости (в милях/час) и времени (в часах). Вот программный код для PPE (вводится как ppe_distance.c):

Листинг 1. PPE-код решения уравнения
#include <stdio.h>
#include <libspe.h>

//This global is for the SPE program code itself.  It will be created by
//the embedspu program.
extern spe_program_handle_t calculate_distance_handle;

//This struct is used for input/output with the SPE task
typedef struct {
	float speed;     //input parameter
	float num_hours; //input parameter
	float distance;  //output parameter
	float padding;   //pad the struct a multiple of 16 bytes
} program_data;

int main() {
	program_data pd __attribute__((aligned(16)));  //aligned for transfer

	//GATHER DATA TO SEND TO SPE
	printf("Enter the speed at which your car is travelling in miles/hr: ");
	scanf("%f", &pd.speed);
	printf("Enter the number of hours you have been driving at that speed: ");
	scanf("%f", &pd.num_hours);

	//USE THE SPE TO PROCESS THE DATA
	//Create SPE Task
	speid_t spe_id = spe_create_thread(0, &calculate_distance_handle, &pd, NULL,
	 -1, 0);
	//Check For Errors
	if(spe_id == 0) {
		fprintf(stderr, "Error creating SPE thread!\n");
		return 1;
	}
	//Wait For Completion
	spe_wait(spe_id, NULL, 0);

	//FORMAT THE RESULTS FOR DISPLAY
	printf("The distance travelled is %f miles.\n", pd.distance);
	return 0;
}

Как уже говорилось, основная работа PPE в процессоре Cell BE – это управлять задачами ввода/вывода. Единственно интересной является часть spe_create_thread. Первый параметр – это ID группы потока. Нулевое значение этого параметра означает, что для потока нужно создать новую группу. Второй параметр – описатель программы SPE, третий параметр – указатель на данные, которые вы хотите передать, четвертый параметр – необязательный указатель среды, пятый параметр – маска, указывающая процессор SPE, на котором вы хотите запустить программу (-1 означает любой доступный SPE), последний параметр – это список опций, которые вы хотите использовать (в данном случае никаких). Функция возвращает ID задачи SPE, который вы потом используете как параметр для spe_wait. spe_wait возвращает, когда SPE завершает задачу.

Вот программный код для SPE (вводится как spe_distance.c):

Листиног 2. Пример SPE-вычислений
//Pull in DMA commands
#include <spu_mfcio.h>


//Struct for communication with the PPE
typedef struct {
	float speed;     //input parameter
	float num_hours; //input parameter
	float distance;  //output parameter
	float padding;   //pad the struct a multiple of 16 bytes
} program_data;

int main(unsigned long long spe_id, unsigned long long program_data_ea, unsigned 
long long env) {
	program_data pd __attribute__((aligned(16)));
	int tag_id = 0;

	//READ DATA IN
	//Initiate copy
	mfc_get(&pd, program_data_ea, sizeof(pd), tag_id, 0, 0);
	//Wait for completion
	mfc_write_tag_mask(1<<tag_id);
	mfc_read_tag_status_any();

	//PROCESS DATA
	pd.distance = pd.speed * pd.num_hours;

	//WRITE RESULTS OUT
	//Initiate copy
	mfc_put(&pd, program_data_ea, sizeof(program_data), tag_id, 0, 0);
	//Wait for completion
	mfc_write_tag_mask(1<<tag_id);
	mfc_read_tag_status_any();
	return 0;
}

В будущих статьях мы рассмотрим программы для SPE более глубоко, а здесь кратко обсудим, что же собственно происходит. Указатель, переданный в качестве третьего параметра в spe_create_thread, передается в эту программу как program_data_ea. EA означает effective address – адрес в основной памяти, как он видится с точки зрения основной программы PPE. Так как SPE не имеет прямого доступа к основной памяти, его нельзя непосредственно разыменовать в указатель. Вместо этого вы должны инициировать запрос на перемещение для копирования данных в вашу локальную память. Когда эти данные окажутся в вашей локальной памяти, вы сможете обращаться к ним через local store address (адрес локальной памяти), иногда сокращаемый как LSA.

mfc_get инициирует перемещение данных в локальную память. Обратите внимание, что и в PPE, и в SPE структура выравнивается по границе 16 байт и дополняется до 16 байт. В следующих статьях мы обсудим это подробнее, но суть состоит в том, что передачи по DMA должны быть выровнены по границе 16 байт и производятся блоками, кратными 16 байт. tag_id позволяет определить статус DMA-операции. Две следующие за передачей функции заставляют программу ждать, пока передача не закончится.

Основная обработка тривиально проста – просто умножение скорости на время. После того как данные обработаны, mfc_put инициирует перемещение обратно в основную память, и следующие две функции заставляют ждать, пока DMA не завершится. Когда все сделано, программа заканчивает работу.

Теперь нужно откомпилировать и запустить программу. Это делается очень просто:

#Compile the SPE program
spu-gcc spe_distance.c -o spe_distance
#Embed the SPE program into an ELF object file, and expose it
#through the global variable: calculate_distance_handle
embedspu calculate_distance_handle spe_distance spe_distance_csf.o
#Compile the PPE program together with the SPE program
gcc ppe_distance.c spe_distance_csf.o -lspe -o distance
#Run the program
./distance

Готово. У нас есть работающая программа для Cell BE.


Выводы

Несмотря на то, что непосредственно программировать PS3 нельзя, поддержка сторонних операционных систем позволяет установить на PS3 ОС Linux. Установка требует некоторых усилий, но в итоге вы получаете недорогой полностью рабочий процессор Cell Broadband Engine. В следующих статьях этой серии более подробно рассматривается программирование Cell BE и максимально эффективное использование ресурсов SPE.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы в первый раз заходите в developerWorks. Выберите данные в своем профиле (имя, страна/регион, компания) которые будут общедоступными и будут отображаться, когда вы публикуете какую-либо информацию. Вы можете изменить данные вашего ИБМ аккаунта в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=253113
ArticleTitle=Программирование высокопроизводительных приложений на процессоре Cell BE, Часть 1: Введение в Linux на PLAYSTATION 3
publish-date=09042007