I have previously shared how to install OpenCL on the Samsung XE303C12 Chromebook powered by the ARM Mali-T604 GPU. I have found that things are slightly different on the newer Samsung XE503C12 Chromebook ("Chromebook 2") powered by the ARM Mali-T628 GPU, so decided to provide an update. As before, please bear in mind that this is not ARM's "official guide". However, it's a useful alternative to the official guide if, for example, you don't have a Linux PC or just want to use Chrome OS day in and day out.
You will need:
How fast you will complete the installation will depend on how fast you can copy-and-paste instructions from this guide (Ctrl-C) into the shell (Shift-Ctrl-C), how fast your Internet connection is and how fast your memory card is. (I will give an approximate time for each step measured when using a rather slow 30 MB/s card). The basic OpenCL installation should take up to half an hour; PyOpenCL and NumPy about an hour; further SciPy libraries about 4 hours. Most of the time, however, you will be able to leave the Chromebook unattended, beavering away while compiling packages from source.
Finally, the instructions are provided "as is", you use them at your own risk, and so on, and so forth.
NB: Enabling Developer Mode erases all user data - do a back up first.
Enter Recovery Mode by holding the ESC and REFRESH (↻ or F3) buttons, and pressing the POWER button. In Recovery Mode, press Ctrl+D and ENTER to confirm and enable Developer Mode.
Open the Chrome browser and press Ctrl-Alt-T.
Welcome to crosh, the Chrome OS developer shell. If you got here by mistake, don't panic! Just close this tab and carry on. Type 'help' for a list of commands.
Don't panic, keep the tab opened and carry on to enter the shell:
crosh> shell chronos@localhost / $ uname -a Linux localhost 3.8.11 #1 SMP Wed Dec 10 14:41:54 PST 2014 armv7l SAMSUNG EXYNOS5 (Flattened Device Tree) GNU/Linux
Insert a blank Micro SD card (denoted as /dev/mmcblk1 in what follows):
/dev/mmcblk1
chronos@localhost / $ mount | grep "SD Card" /dev/mmcblk1p1 on /media/removable/SD Card type vfat (rw,nosuid,nodev,noexec,relatime,dirsync,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,flush,errors=remount-ro)
Unmount the card and run fdisk:
fdisk
chronos@localhost / $ sudo umount /dev/mmcblk1p1 chronos@localhost / $ sudo /sbin/fdisk /dev/mmcblk1 Welcome to fdisk (util-linux 2.24).Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help):
Enter 't' to change a partition type, then '83' to change the partition type to 'Linux', and finally 'w' to apply the change:
Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 83 If you have created or modified any DOS 6.x partitions, please see the fdisk documentation for additional information. Changed type of partition 'W95 FAT32 (LBA)' to 'Linux'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. chronos@localhost / $
Format the card e.g. using ext3:
chronos@localhost / $ sudo /sbin/mkfs.ext3 /dev/mmcblk1p1
NB: If you use a card that is less than 8 GB, you may need to reserve enough inodes when you format the card e.g.:
chronos@localhost / $ sudo /sbin/mkfs.ext3 /dev/mmcblk1p1 -j -T small
Mount the card and check that it's ready:
chronos@localhost / $ sudo mkdir -p ~/gentoo chronos@localhost / $ sudo mount -o rw,exec -t ext3 /dev/mmcblk1p1 ~/gentoo chronos@localhost / $ df -h ~/gentoo Filesystem Size Used Avail Use% Mounted on /dev/mmcblk1p1 15G 38M 14G 1% /home/chronos/user/gentoo chronos@localhost / $ df -hi ~/gentoo Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mmcblk1p1 951K 11 951K 1% /home/chronos/user/gentoo
chronos@localhost / $ cd ~/gentoo chronos@localhost ~/gentoo $ ls -la total 32 drwxr-xr-x 3 root root 4096 Dec 9 21:31 . drwx--x--- 30 chronos chronos-access 12288 Dec 9 21:38 .. drwx------ 2 root root 16384 Dec 9 21:31 lost+found
Download the latest stage 3 archive for armv7a_hardfp:
armv7a_hardfp
chronos@localhost ~/gentoo $ sudo wget http://distfiles.gentoo.org/releases/arm/autobuilds/latest-stage3-armv7a_hardfp.txt chronos@localhost ~/gentoo $ sudo wget http://distfiles.gentoo.org/releases/arm/autobuilds/`cat latest-stage3-armv7a_hardfp.txt | grep stage3-armv7a_hardfp`
Extract the downloaded archive right onto the card e.g.:
chronos@localhost ~/gentoo $ sudo tar xjpf stage3-armv7a_hardfp-20141023.tar.bz2
Clean up:
chronos@localhost ~/gentoo $ sudo rm latest-stage3-armv7a_hardfp.txt chronos@localhost ~/gentoo $ sudo rm stage3-armv7a_hardfp-20141023.tar.bz2
Go to the page listing Mali-T6xx Linux drivers and download release r4p0-02rel0 for Mali-T62x fbdev (mali-t62x_r4p0-02rel0_linux_1+fbdev.tar.gz). Make sure you carefully read and accept the associated licence terms.
r4p0-02rel0
mali-t62x_r4p0-02rel0_linux_1+fbdev.tar.gz
chronos@localhost ~/gentoo $ sudo tar xvzf ~/Downloads/mali-t62x_r4p0-02rel0_linux_1+fbdev.tar.gz
This will create ~/gentoo/fbdev which we will use later.
~/gentoo/fbdev
Similar to crouton, we will use chroot to enter our Linux environment.
Create two scripts and make them executable:
chronos@localhost ~/gentoo $ sudo vim ~/gentoo/setup.sh #!/bin/sh GENTOO_DIR=/home/chronos/user/gentoo mount -t proc /proc $GENTOO_DIR/proc mount --rbind /sys $GENTOO_DIR/sys mount --rbind /dev $GENTOO_DIR/dev cp /etc/resolv.conf $GENTOO_DIR/etc chronos@localhost ~/gentoo $ sudo vim ~/gentoo/enter.sh #!/bin/sh GENTOO_DIR=/home/chronos/user/gentoo LC_ALL=C chroot $GENTOO_DIR /bin/bash chronos@localhost ~/gentoo $ sudo chmod u+x ~/gentoo/setup.sh ~/gentoo/enter.sh
Execute the scripts:
chronos@localhost ~/gentoo $ sudo ~/gentoo/setup.sh chronos@localhost ~/gentoo $ sudo ~/gentoo/enter.sh localhost / #
Note that the ~/gentoo directory will become the root (/) directory once we enter our new Linux environment. For example, ~/gentoo/fbdev will become /fbdev inside the Linux environment.
~/gentoo
/
/fbdev
Download OpenCL header files from the Khronos OpenCL registry:
localhost / # mkdir /usr/include/CL && cd /usr/include/CL localhost / # wget http://www.khronos.org/registry/cl/api/1.1/opencl.h localhost / # wget http://www.khronos.org/registry/cl/api/1.1/cl_platform.h localhost / # wget http://www.khronos.org/registry/cl/api/1.1/cl.h localhost / # wget http://www.khronos.org/registry/cl/api/1.1/cl_gl.h localhost / # wget http://www.khronos.org/registry/cl/api/1.1/cl_ext.h
Change properties on the downloaded OpenCL driver files and copy them to /usr/lib:
/usr/lib
localhost / # chown root /fbdev/* localhost / # chgrp root /fbdev/* localhost / # chmod 755 /fbdev/* localhost / # mv /fbdev/* /usr/lib localhost / # rmdir /fbdev
By now you should have a mint Linux installation complete with the OpenCL drivers and headers, so you can start playing with OpenCL!
When you reboot, you just need to mount the card and execute the setup script again:
chronos@localhost / $ sudo mount -o rw,exec -t ext3 /dev/mmcblk1p1 ~/gentoo chronos@localhost / $ sudo ~/gentoo/setup.sh
Then you can pop in and out of the Linux environment with:
chronos@localhost / $ sudo ~/gentoo/enter.sh localhost / # exit chronos@localhost / $
But the fun just begins here! Follow the instructions below to install PyOpenCL and SciPy libraries for scientific computing.
Portage is Gentoo's package management system.
localhost / # echo "MAKEOPTS=\"-j4\"" >> /etc/portage/make.conf localhost / # echo "ACCEPT_KEYWORDS=\"~arm\"" >> /etc/portage/make.conf localhost / # mkdir /etc/portage/profile localhost / # mkdir /etc/portage/package.use localhost / # mkdir /etc/portage/package.unmask localhost / # mkdir /etc/portage/package.accept_keywords localhost / # mkdir /etc/portage/package.keywords localhost / # touch /etc/portage/package.keywords/dependences
Perform an update:
localhost / # emerge --sync --quiet localhost / # emerge --oneshot portage localhost / # eselect news read
NB: If any emerge command below fails, rerun it with the --autounmask-write flag; then run etc-update and answer '-3' followed by 'y'. Running emerge again should now get the build started e.g.:
emerge
--autounmask-write
etc-update
localhost / # emerge --autounmask-write dev-python/pandas localhost / # etc-update Scanning Configuration files... The following is the list of files which need updating, each configuration file is followed by a list of possible replacement files. 1) /etc/portage/package.keywords/dependences (1) Please select a file to edit by entering the corresponding number. (don't use -3, -5, -7 or -9 if you're unsure what to do) (-1 to exit) (-3 to auto merge all files) (-5 to auto-merge AND not use 'mv -i') (-7 to discard all updates) (-9 to discard all updates AND not use 'rm -i'): -3 Replacing /etc/portage/package.keywords/dependences with /etc/portage/package.keywords/._cfg0000_dependences mv: overwrite '/etc/portage/package.keywords/dependences'? y Exiting: Nothing left to do; exiting. localhost / # emerge dev-python/pandas
localhost / # eselect python set python2.7 localhost / # emerge dev-python/setuptools
Install NumPy with LAPACK as follows.
localhost / # echo "dev-python/numpy lapack" >> /etc/portage/package.use/numpy localhost / # echo "dev-python/numpy -lapack" >> /etc/portage/profile/package.use.mask localhost / # emerge dev-python/numpy localhost / # python -c "import numpy; print numpy.__version__" 1.9.1
Install PyOpenCL.
localhost / # cd /tmp localhost tmp # wget https://pypi.python.org/packages/source/p/pyopencl/pyopencl-2014.1.tar.gz localhost tmp # tar xzf pyopencl-2014.1.tar.gz localhost tmp # cd pyopencl-2014.1 localhost pyopencl-2014.1 # python configure.py localhost pyopencl-2014.1 # make install localhost pyopencl-2014.1 # cd examples localhost examples # python demo.py Choose device(s): [0] <pyopencl.Device 'Mali-T628' on 'ARM Platform' at 0x-49b96370> [1] <pyopencl.Device 'Mali-T628' on 'ARM Platform' at 0x-49b96270> Choice, comma-separated [0]:0 Set the environment variable PYOPENCL_CTX='0' to avoid being asked again. (0.0, 241.52145) localhost examples # python -c "import pyopencl; print pyopencl.VERSION_TEXT" 2014.1
(That's right! The Exynos 5420 chip effectively has two Mali-T62x GPUs: GPU 0 has 4 cores; GPU 1 has 2 cores. How cool is that?)
If you would like to follow my posts on benchmarking (e.g. see the intro), I recommend you install packages from the SciPy family.
localhost / # emerge dev-python/ipython localhost / # ipython --version 2.3.1
Install IPython Notebook to enjoy a fun blend of Chrome OS and IPython experience.
localhost / # emerge dev-python/jinja dev-python/pyzmq www-servers/tornado localhost / # ipython notebook 2014-05-08 06:49:08.424 [NotebookApp] Using existing profile dir: u'/root/.ipython/profile_default' 2014-05-08 06:49:08.440 [NotebookApp] Using MathJax from CDN: http://cdn.mathjax.org/mathjax/latest/MathJax.js 2014-05-08 06:49:08.485 [NotebookApp] Serving notebooks from local directory: / 2014-05-08 06:49:08.485 [NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888/ 2014-05-08 06:49:08.486 [NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). 2014-05-08 06:49:08.486 [NotebookApp] WARNING | No web browser found: could not locate runnable browser.
Open http://127.0.0.1:8888/ in a new Chrome tab to start creating your own IPython Notebooks!
localhost / # emerge dev-python/matplotlib localhost / # python -c "import matplotlib; print matplotlib.__version__" 1.4.2
localhost / # emerge sci-libs/scipy localhost / # python -c "import scipy; print scipy.__version__" 0.14.0
localhost / # emerge dev-python/pandas localhost / # python -c "import pandas; print pandas.__version__" 0.14.1