---
# System prepended metadata

title: 'Book : Raspberry Pi GPU Audio Video Programming'
tags: [GPGPU Programming & GPU Hardware Design]

---

Reference \:
> * Raspberry Pi GPU Audio Video Programming
> https://github.com/Apress/raspberry-pi-gpu-audio-video-prog
> * Respberry Pi Wiki
> https://zh.wikipedia.org/zh-tw/%E6%A0%91%E8%8E%93%E6%B4%BE

# Raspberry Pi 3 Setup

## Monitoring Raspberry Pi

https://chem.libretexts.org/Courses/Intercollegiate_Courses/Internet_of_Science_Things/5%3A_Appendix_3%3A_General_Tasks/5.9%3A_Monitoring_your_Raspberry_Pi#:~:text=Monitoring%20Clock%20Frequency%2C%20Voltage%20and%20Temperature,-Using%20the%20vcgencmd&text=According%20to%20Raspberry%20Pi%20Documentation,with%20a%20half%2Dfilled%20thermometer.

## Python Virtual Environment Create

https://learn.microsoft.com/zh-tw/windows/python/web-frameworks

```bash
sudo apt install python3-pip

sudo apt install python3-venv

cd python_dev

python3 -m venv .venv

source .venv/bin/activate

deactivate
```

By the way, all the python environment in my system is created in this way

## Check Raspberry Pi Model in CommandLine

https://linuxconfig.org/how-to-check-raspberry-pi-model

## Check Raspberry Pi OS Info

```clike
cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    
uname --all
Linux raspberrypi 6.1.21-v7+ #1642 SMP Mon Apr  3 17:20:52 BST 2023 armv7l GNU/Linux
```

## Raspberry Pi 3 B+ `xv` Built-in Function `show()`

```bash
sudo apt-get install xli -y
cd /usr/local/bin
sudo ln -s /usr/bin/xli xv
```

# Introduction

> There are a multitude of APIs and programming styles for programming graphics systems. The Raspberry Pi supports a few of these: OpenGL ES for 3D programming, OpenVG for 2D vector graphics programming, and OpenMAX for video and audio. 

:::info
:information_source: **Information of Libraries used in the book**

* OpenGL ES
> * https://blog.csdn.net/m0_60259116/article/details/124059906#:~:text=OpenGL%20ES%20
> * https://blog.csdn.net/qq_23034515/article/details/108283747

* OpenVG

> OpenVG is an alternative approach to graphics to OpenGL. While OpenGL renders onto textures, OpenVG is more concerned with drawing lines to form shapes and then rendering within those shapes.

* OpenMAX

> * https://zh.wikipedia.org/zh-tw/OpenMAX
:::

# Hardware Info & Libraries

## VideoCore® IV Reference 3D Architecture Reference Guide

Reference \:
> https://docs.broadcom.com/doc/12358545
> https://github.com/hermanhermitage/videocoreiv

**QPU**

> The VideoCore IV 3D architecture is scalable, based around multiple specialist floating-point shading processors called QPUs

> Scalability is principally provided by multiple instances of a special purpose floating-point shader processor, termed a Quad Processor \(QPU\). The QPU is a 16-way SIMD processor. Each processor has two vector floatingpoint ALUs which carry out multiply and non-multiply operations in parallel with single instruction cycle latency. Internally the QPU is a 4\-way SIMD processor multiplexed 4× over four cycles, making it particularly suited to processing streams of quads of pixels.

## VC4CL \: OpenCL Implementation

Reference \:
> * https://github.com/doe300/VC4CL
> * https://yunusmuhammad007.medium.com/build-install-opencl-on-raspberry-pi-3-fb8139acd493

OpenCL implementation on VideoCore IV is the best way to use the GPU on Raspberry Pi 3 in my opinion. 

```clike
Number of platforms                               1
  Platform Name                                   OpenCL for the Raspberry Pi VideoCore IV GPU
  Platform Vendor                                 doe300
  Platform Version                                OpenCL 1.2 VC4CL 0.4.9999 (b5a6097)
  Platform Profile                                EMBEDDED_PROFILE
  Platform Extensions                             cl_khr_il_program cl_khr_spir cl_khr_create_command_queue cl_altera_device_temperature cl_altera_live_object_tracking cl_khr_icd cl_khr_extended_versioning cl_khr_spirv_no_integer_wrap_decoration cl_khr_suggested_local_work_size cl_vc4cl_performance_counters
  Platform Extensions function suffix             VC4CL

  Platform Name                                   OpenCL for the Raspberry Pi VideoCore IV GPU
Number of devices                                 1
  Device Name                                     VideoCore IV GPU
  Device Vendor                                   Broadcom
  Device Vendor ID                                0x14e4
  Device Version                                  OpenCL 1.2 VC4CL 0.4.9999 (b5a6097)
  Device Numeric Version                          0x402000 (1.2.0)
  Driver Version                                  0.4.9999
  Device OpenCL C Version                         OpenCL C 1.2 
  Device Type                                     GPU
  Device Profile                                  EMBEDDED_PROFILE
  Device Available                                Yes
  Compiler Available                              Yes
  Linker Available                                Yes
  Max compute units                               1
  Available core IDs                              0
gpuserv: vc_gpuserv_init: starting initialisation
  Max clock frequency                             300MHz
  Core Temperature (Altera)                       43 C
  Device Partition                                (core)
    Max number of sub-devices                     0
    Supported partition types                     None
    Supported affinity domains                    (n/a)
  Max work item dimensions                        3
  Max work item sizes                             12x12x12
  Max work group size                             12
  Preferred work group size multiple (kernel)     1
  Preferred / native vector sizes                 
```

## Libraries

* QPULib
https://github.com/mn416/QPULib
* PiMD
https://pkoenig10.github.io/pimd/
