OpenCL di Smartphone

ah, gw telat update dengan berita ini.. ini berkaitan dengan postingan lama,.. komputasi parallel di smartphone..

dan ternyata diem-diem Google sempat menyisipkan OpenCL drivers ke smartphone Nexus 4 dan tablet Nexus 10 di awal tahun ini.. hal ini dilaporkan oleh Kishonti Ltd. setelah mereka berhasil menjalankan CLBenchmark di tablet Nexus 10 (Mali GPU T-604)..

tapi kemudian tercium aroma ketidaksehatan di sini.. tampaknya Google merasa gengsi menggunakan OpenCL.. meskipun sekarang di-“maintain” oleh Khronos Group dan bersifat terbuka, bagaimanapun ide dan pengembangan awal OpenCL berasal dari Apple.. mungkin saja Google merasa risih ada aroma Apple di produknya..

dan bener saja, di update-an firmware untuk Nexus 4 dan Nexus 10 yang rilis agustus lalu.. Google menghapus OpenCL driver dari firmware.. ish ish ish.. sungguh tak dewasa..  [emoji angry face]

sebenarnya Google telah merilis sebuah framework untuk komputasi di Android buatan mereka sendiri, yang diberi nama “RenderScript“.. sama halnya seperti OpenCL, RenderScript juga bersifat cross-platform, mampu memanfaatkan sumber daya komputasi yang tersedia di smartphone (CPU, GPU, DSP).. akan tetapi, tindakan Google menghapus OpenCL driver terkesan “memaksa” Android developer untuk menggunakan RenderScript buatan mereka ketimbang OpenCL… hal ini jadi perdebatan seru di sini..

syukurnya, Qualcomm sebagai produsen mobile processor, tetap terus berusaha mengembangkan OpenCL driver untuk produknya.. dan kabarnya sudah berhasil untuk Snapdragon 600 (Adreno 320 GPU) dan Snapdragon 800 (Adreno 330 GPU)..

ah, ingin segera mencicipi supercomputing di smarphone.. mudah-mudahan segera ada rezeki buat punya Android smartphone dengan Snapdragon 800 di dalamnya.. jadi bisa mencicipi OpenCL dan RenderScript sekaligus.. doain yah..  [emoji grinning face]

lalu bagaimana dengan CUDA ? kabarnya akhir tahun ini NVIDIA akan merilis Tegra 5 yang konon akan support CUDA.. tampaknya era “smartphone computing” akan dimulai tahun depan.. interesting !!  [emoji smirking face]

[ WeekendProjects ] Python and GPU

Wiken kali ini pengen nyobain gimana menggunakan python untuk gpu programming.. ga sampe terlalu detil, cuma instalasi dan running sample codenya doank.. yang penting link-link pentingnya sudah diamankan.. [emoji grinning face with smiling eyes]

1. PyCUDA = python + cuda

Download: pypi/pycuda
Instalasi: PyCuda/Installation
Dokumentasi: documen.tician.de/pycuda/

2. PyOpenCL = python + opencl

Download: pypi/pyopencl
Instalasi: PyOpenCL/Installation
Dokumentasi: documen.tician.de/pyopencl/

Untuk sementara itu dulu.. kalau ada kesempatan dan mood, kita lanjut lagi..  [emoji grinning face with smiling eyes]

installing OpenCV with GPU modul in Mac

I was trying to install OpenCV 2.4.5 with GPU modul in Mac OSX Mountain Lion (10.8.4) but got some errors. Trying to find solution through Google, but didn’t get much information. Finally, after couple hours, I got the idea, it’s coming from several sources, so I just collect them here to help others who may need this.

Follow instructions in OpenCV_GPU

  1. Download and extract the source.
  2. Use Terminal, and create Build folder
  3. Use CMAKE GUI to configure
  4. Use Terminal and go to Build folder, then type make to compile
  5. Type sudo make install to install

And then, you may get this error :

[ 16%] Building NVCC (Device) object modules/ ... /cuda_compile_generated_matrix_
operations.cu.o
cc1plus: error: unrecognized command line option "-Wno-narrowing"
cc1plus: error: unrecognized command line option "-Wno-delete-non-virtual-dtor"
cc1plus: error: unrecognized command line option "-Wno-unnamed-type-template-args"

Solution : Actually, it’s because in Mac use llvm-gcc compiler. So, you have to download the “TRUE” gcc compiler via MacPort. If you don’t have MacPort yet, don’t be lazy, just Google-ing how to install it. 😀 I use gcc 4.6.4, but you can try the latest one if you already have.

sudo port install gcc46

By default, anything you’ve installed via MacPort will go to /opt/local/bin/. So, you have to make a symbolic link to gcc in /usr/bin

#> sudo unlink /usr/bin/gcc
#> sudo ln -s /opt/local/bin/x86_64-apple-darwin12-gcc-4.6.4 /usr/bin/gcc

and try to compile again.


If you get error like this.

Undefined symbols for architecture x86_64:
"std::ctype<char>::_M_widen_init() const", referenced from:
stdDebugOutput(cv::String const&) in cuda_compile_generated_NCV.cu.o
ld: symbol(s) not found for architecture x86_64

Keep calm, and follow solution below. 😀

Solution : You need to set “-fno-inline” flag in CMAKE_CXX_FLAGS. Open your CMAKE GUI, put a checklist in “Advanced“, you’ll see CMAKE_CXX_FLAGS attribute name.

It should be okay, now ! 🙂

installing cuda 5 on ubuntu 12.04

  1. Download CUDA 5 installers from https://developer.nvidia.com/cuda-downloads.
  2. Add execution mode to the run file.
    • $ chmod +x cuda_5.*.run
  3. Change to terminal mode Ctrl-Alt-F1, log on and type
    • $ sudo service lightdm stop
    • $ sudo ./cuda_5.*.run
    • $ sudo shutdown -r now

If you failed to get back to login gui, type this:

  • $ sudo apt-get purge nvidia*
  • $ sudo apt-get install nvidia-current-updates-dev

MATLAB OpenCL Toolbox – Update

I made a little update on Matlab OpenCL Toolbox so now it can support the binary file of opencl program, and also a little update to avoid the compilation error in Mac or Linux..

ocl = opencl();
ocl.initialize(1,2);
ocl.addbinary('binaryprogram.clbin');
ocl.build();

the update is available here.
credit should go to the original author: Radford Juang

MATLAB OpenCL Toolbox on Mac Lion

Steps:

1. download toolbox source from this link and unzip it.
2. edit make.m

[sourcecode language=”bash”]
opencl_include_dir = ‘/System/Library/Frameworks/OpenCL.framework/Headers’;
mex(‘src/openclcmd.cpp’, ‘-Iinclude’, [‘-I’ opencl_include_dir]);
[/sourcecode]

3. edit your ~/.matlab/R20XXa/mexopts.sh. Check lines after “maci64” line and modify CLIBS and CXXLIBS so they become:

[sourcecode language=”bash”]
CLIBS="$MLIBS -framework OpenCL"
CXXLIBS="$MLIBS -lstdc++ -framework OpenCL"
[/sourcecode]

4. open MATLAB and go to the opencl-toolbox directory
5. run make

>> make

6. add this directory as MATLAB path

>> addpath /replace/with/the/directory/path/

errors in cuda 4.0

I’m just trying the cuda 4.0 on my macbook. And, as usual, i’m too lazy to read the “what’s new” page or doc. Just go straight to test it until got stuck with the errors.. 😀

Here, I’ll list any kind of errors i experienced with, and hopefully it’ll come along with solution.. 😛

First, i’m trying to compile an old simple code. This code was fine using cuda 3.2, but when I compile it using cuda 4.0, this kind of error comes out..

cudaLK.o:1203:53: warning: null character(s) ignored
cudaLK.o:1203:101: warning: null character(s) ignored
cudaLK.o:1203:112: warning: null character(s) preserved in literal
cudaLK.o:1203:112: warning: missing terminating ' character
cudaLK.o(1): error: unrecognized token

whoaa…… this forced me to read the programming guide, again..

Finally, when my eyes went to nvcc section, I got the clue… It looks like nvidia change the format of nvcc command.. In earlier version, simple nvcc command was

nvcc -c <cudacodefile>.cu -o <cudacodefile>.o

But for cuda 4.0, you don’t need to define the object file. nvcc will automatically define the object file based on the .cu file name. So, it should be simply..

nvcc -c <cudacodefile>.cu

to be continued later..

get EAGLview screenshot with transparency in landscape mode

this is NOT mine actually. the original source can be found at the end of this post. i post here just for helping people who may need it. so they don’t need to spend whole day for “googling” this like i did. 😀

the key to get the transparency is this line:

[code language=”cpp”]
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast;
[/code]

now, this is the complete method. NOTE: this is for landscape mode (480 x 320), if you want in portrait, simply modify the size.

[code language=”cpp” wraplines=”false”]
– (UIImage*) getGLScreenshot {
NSInteger myDataLength = 480 * 320 * 4;

// allocate array and read pixels into it.
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, 480, 320, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

// gl renders "upside down" so swap top to bottom into new array.
// there’s gotta be a better way, but this works.
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
for(int y = 0; y <320; y++)
{
for(int x = 0; x < 480* 4; x++)
{
buffer2[(319 – y) * 480 * 4 + x] = buffer[y * 4 * 480 + x];
}
}

// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
buffer2, myDataLength, NULL);

// prep the ingredients
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * 480;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

/***************** to handle the transparency/alpha ******************/
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast;
//CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
/*********************************************************************/

CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

// make the cgimage
CGImageRef imageRef = CGImageCreate(480, 320, bitsPerComponent,
bitsPerPixel, bytesPerRow, colorSpaceRef,
bitmapInfo, provider, NULL, NO, renderingIntent);

// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
return myImage;
}

[/code]

Source: www.iphonedevsdk.com

portable version of GPU Caps Viewer

GPU Caps Viewer is a tool to see your graphics card information with focus on the OpenGL, OpenCL, and CUDA API level support. It’s developed by Geeks3D and unfortunately only support Win 32-bit. ( no linux there 🙁 )

The latest version (1.9.4 released on 2010.11.05) can be downloaded here. Read More …

disabling nouveau kernel driver

Cuma catetan dikit ttg linux (fedora 11 ke atas) biar gampang nyari. Baru tau kalo ternyata mulai dari kernel 2.6.33 ke atas, di dalamnya udah terdapat open graphics driver yang compatible ama GeForce, namanya, “nouveau”. Sebenarnya sih, hal ini menguntungkan karna kita tidak perlu repot lagi nyari-nyari driver buat VGA. Tetapi untuk beberapa keperluan yang berkaitan langsung dengan fitur keluaran NVIDIA yang memerlukan official driver dari NVIDIA, seperti CUDA, hal ini jadi masalah. nouveau akan menghalangi proses instalasi driver.

Therefore, we have to disable the nouveau kernel driver. We just need to add following to the “kernel” line in grub.conf (/etc/grub.conf or /boot/grub/grub.conf)

[sourcecode language=”bash”]
rdblacklist=nouveau
[/sourcecode]

the grub.conf will then look like

[sourcecode language=”bash” highlight=”3″]
title Fedora (2.6.31.5-127.fc12.i686.PAE)
root (hd0,2)
kernel /vmlinuz-2.6.31.5-127.fc12.i686.PAE ro root=/dev/mapper/vg_satriahost-lv_root LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rhgb quiet rdblacklist=nouveau
initrd /initramfs-2.6.31.5-127.fc12.i686.PAE.img
[/sourcecode]

After reboot, you can install the official NVIDIA driver.

Source: http://www.h-online.com/open/news/item/Kernel-Log-Linux-2-6-33-to-include-NVIDIA-graphics-driver-nouveau-885001.html