Di sini saya tidak hendak menjadi motivator hidup yang mengajak para pendengarnya untuk bisa memikirkan beberapa masalah secara parallel :P. Tapi literally, sebagai programmer, bagaimana kita memanfaatkan resource komputer yang semakin canggih. Salah satunya lewat “parallel programming”.
Pertama kali disebutkan kata “parallel algorithm”, secara pribadi bayangan saya langsung mengarah ke OpenMP ataupun CUDA/OpenCL, terbayang cluster-cluster komputer ala OpenMP, ataupun block-block komputasi ala CUDA. Hanya saja bagi kita yg punya resource terbatas (baca: kurang dana), implementasi CUDA maupun OpenMP menjadi angan-angan.
Tapi kalau kita kembali ke objective dari parallel algorithm, intinya kan bagaimana kita membuat program yang kita buat berjalan lebih cepat dan efisien dengan memanfaatkan resource yang ada. Dilihat dari sisi resource, komputer2 jaman sekarang sudah memiliki core lebih dari 1 (taruhlah mulai dari core2Duo sampai i7). Kalau panjenengan punya komputer dengan processor intel seperti yang telah disebutkan, berbahagialah. Sampeyan bisa menerapkan trik sederhana untuk (mungkin) mempercepat laju program yang anda buat.
Adalah Intel Thread Building Block (TBB), sebuah library open source (untuk pemakaian academic atau kalangan sendiri), yang membantu proses pembuatan algoritma parallel. Library ini pada dasarnya membagi program menjadi task2 untuk dieksekusi memanfaatkan core processor yang tersedia. Penggunaannya pun sangat mudah, C++ Template-like, hanya dengan menambahkan header dan dynamic library, . . . . dan selesai, biarkan implementasi memory handle, abstraksi, dkk, dilakukan oleh TBB. Library terkenal OpenCV pun secara intensif memanfaatkan TBB sebagai salah satu pendukung di dalamnya (hasil dari obrak-abrik daleman OpenCV, TBB ternyata banyak digunakan dalam operasi matrix dan terutama pada modul machine learning nya).
Sebagai contoh pancingan, berikut adalah contoh operasi perkalian matrix tanpa dan dengan TBB
#include "tbb/parallel_for.h"
#include "tbb/blocked_range2d.h"
using namespace tbb;
const size_t L = 150;
const size_t M = 225;
const size_t N = 300;
void SerialMatrixMultiply( float c[M][N], float a[M][L], float b[L][N] ) {
for( size_t i=0; i<M; ++i ) {
for( size_t j=0; j<N; ++j ) {
float sum = 0;
for( size_t k=0; k<L; ++k )
sum += a[i][k]*b[k][j];
c[i][j] = sum;
}
}
}
// class abstraksi TBB
class MatrixMultiplyBody2D {
float (*my_a)[L];
float (*my_b)[N];
float (*my_c)[N];
public:
void operator()( const blocked_range2d<size_t>& r ) const {
float (*a)[L] = my_a;
float (*b)[N] = my_b;
float (*c)[N] = my_c;
for( size_t i=r.rows().begin(); i!=r.rows().end(); ++i ){
for( size_t j=r.cols().begin(); j!=r.cols().end(); ++j ) {
float sum = 0;
for( size_t k=0; k<L; ++k )
sum += a[i][k]*b[k][j];
c[i][j] = sum;
}
}
}
MatrixMultiplyBody2D( float c[M][N], float a[M][L], float b[L][N] ) :
my_a(a), my_b(b), my_c(c)
{}
};
void ParallelMatrixMultiply(float c[M][N], float a[M][L], float b[L][N]){
parallel_for( blocked_range2d<size_t>(0, M, 16, 0, N, 32),
MatrixMultiplyBody2D(c,a,b) );
}
int main(){
float A[M][L];
float B[L][N];
float C[M][N];
// init matrix A,B here
// init timing here
// Serial version
SerialMatrixMultiply(C, B, A);
// Record time here
// Parallel version
ParallelMatrixMultiply(C, B, A);
// Record time here
return 0;
}
Sebetulnya ada lagi library bawaan visual studio (sepertinya sejak visual studio 2010 ??) yang bisa digunakan untuk membangun parallel algorithm, yaitu Parallel Pattern Library (PPL) dan C++ Accelerated Massive Parallelism (C++ AMP), hanya saja belum sempat mendalami. Ada lagi yang menggunakan SIMD instruction (SSE2,SSE3).
“Intel TBB is not just a threads-replacement library. It represents a higher-level, task-based parallelism that abstracts platform details and threading mechanisms for scalability and performance.” (quote from Intel TBB)
Untuk lebih lengkapnya, bisa dirujuk ke tautan asalnya,
source image : http://www.frandroid.com/marques/google/15853_android-sur-atom-avec-des-processeurs-sandy-bridge-en-vue
