Wednesday, February 8, 2012

Menjalankan Fungsi Matlab dengan Compiler C

Berikut ini kita akan belajar bagaimana membuat sebuah fungsi matlab (.m) bisa dijalankan di compiler C dengan platform Windows. Dalam hal ini kita menggunakan platform Microsoft Visual Studio. Cara ini akan memudahkan bagi kita apabila sebuah fungsi sudah cukup advance di matlab, dan kita hanya perlu memanfaatkannya (dalam bentuk shared library) tanpa perlu mengconvert code tersebut seluruhnya ke dalam platform C/C++. Kali ini kita akan membuat contoh sederhana sebuah code matlab yang akan dicoba dimanfaatkan dalam platform C (dalam bentuk shared library) kemudian bisa menghasilkan file .exe.

1. Pertama kita membuat fungsi matlab. Sebagai contoh fungsi coffeebreak.m sebagai berikut :

function coffeebreak
% Load the topographical data for the globe
load('topo.mat', 'topo', 'topomap1');

% Create a unit sphere with 50 facets. This sphere is the Earth.
[x,y,z] = sphere(50);

% Establish initial viewing and lighting parameters. Use Phong shading
% and texture mapping to wrap the topo map data around the sphere.

props.FaceColor= 'texture';
props.EdgeColor = 'none';
props.FaceLighting = 'phong';
props.CData = topo;

% Set the viewpoint to look at the Atlantic Ocean.
view(-130, 10);

% Draw the sphere, with the topo data texture mapped to the surface.
s=surface(x,y,z,props);
set(gcf, 'Color', 'white');  % White background
axis square
axis off
axis equal

title('Coffee Break  at Indonesian Chip Engineer.', 'FontSize', 14, 'FontWeight', 'Bold');
end

referensi code : http://blogs.mathworks.com/loren/2010/11/18/deploying-standalone-applications/

2. Kemudian jalankan program coffeebreak.m diatas di platform matlab dengan sintax berikut ini. Ini bertujuan untuk membuat file 'shared library'.
mcc -t -L C -W lib:mylib -T link:lib -h coffeebreak.m libmmfile.mlib

maka pada folder/directory tempat kita menyimpan, akan ada tambahan beberapa file sebagai berikut :
- mccExcludedFiles (text document)
- mylib.c
- mylib.dll
- mylib (export library file)
- mylib.exports
- mylib.h
- mylib (object file library)
- mylib.prj
- mylib_mcc_component_data.c
- readme.txt
3. Buka software Microsoft Visual Studio (MVS) dan membuat code C yang sesuai dengan mylib.dll yang sudah dihasilkan pada poin 2 diatas. Untuk membuat code C, kita membutuhkan software dependency walker untuk membaca fungsi-fungsi apa saja yang ada dalam mylib.dll.
4. Kalau belum memilki dependency walker, silahkan download di internet. Setelah file mylib.dll dibuka di software ini maka akan didapatkan fungsi-fungsi yang bisa kita gunakan sebagai fungsi code C kita. Dan berikut main.c yang bisa kita hasilkan :
#include 
#include < windows>
#include "mylib.h"

int main ()
{
mylibInitialize();       
mlfCoffeeBreak();
mylibTerminate();
/* ketiga sintac diatas diambil dari hasil extraksi mylib.dll dengan menggunakan software dependency walker */
}
5. Pada software Microsoft visual studio, bagian header files, silahkan ambil dari mylib.h yang sudah dihasilkan pada point 2.
6. Pada software Microsoft visual studio , klik pada bagian nama project, kemudian klik kanan. Pilih bagian properties. Pada bagian C/C++pilih bagian ‘general’ dan tambahkan ‘additional include directories’ dengan $MATLABROOT\extern\include\cpp;$MATLAB\extern\include
7. Pada bagian ‘preprocessor’ kita bisa tambahkan _MBCS, MSVC, MSWIND, IBMPC
8. Pada bagian ‘code generation’, pastikan untuk runtime library sudah tersetting : Multi-threaded Debug DLL (/MDd)
9. Pada bagian resource files, masukkan mylib.lib.
10. Pada folder computer kita, pastikan seluruh file pada poin 2 sudah berada satu directory dengan main.c.
11. Balik lagi ke software MVS, kita bisa compile project dengan cara ‘Build’ or ‘Rebuild’.
12. Setelah decompile, nanti pada bagian directory debug di computer kita bisa ditemukan file .exe.
13. Sebelum dijalankan, copy mylib.dll ke folder tempat .exe berada. Dan jalankan code exe-nya !!... maka hasilnya adalah sebagai berikut :


Silahkan mencoba ^_^

(fin / yan)


Referensi :
1. http://www.mathworks.com/support/solutions/en/data/1-18CBI/index.html?solution=1-18CBI
2. http://goffconcepts.com/techarticles/development/cpp/calldll.html

Tuesday, May 10, 2011

14th IEEJ International Analog VLSI Conference in Indonesia 2011


First Call For Paper

2011 IEEJ International Analog VLSI Workshop
November 2 - 4, 2011 Bali, Indonesia

INTRODUCTION
The Research Committee on Electronic Circuits of the Institute of Electrical Engineers of Japan (IEEJ) is sponsoring and cooperating with Bandung Institute of Technology and IEEE Indonesia Section to hold the 2011 International Analog VLSI Workshop in Bali, Indonesia, on November 2-4, 2011. The purpose of the workshop is to exchange information, ideas and recent research results on analog VLSI circuits and their applications. This workshop has formed a long-standing community for various analog VLSI circuit specialists from both industry and academia worldwide, and promoted active brainstorming among them at the site.

TOPICS:

   * Analog and Mixed Analog-Digital Integrated Circuits (Amplifiers,
      Filters, Comparators, Oscillators, Multipliers, Voltage/Current
      References, Sample-And-Hold Circuits, A/D and D/A Converters, PLL,
      High speed IO Interface, DC-DC converters)

   * Analog Signal and Information Processing  Applications
      (Telecommunication, Multimedia, Automotive Electronics, Biomedical
      Electronics, Consumer Electronics, Neural Networks, Sensing and
      Sensor Networks, Space and Military Electronics)

   * Analog VLSI Design Automation (Layout Techniques, Simulation
      Techniques, AHDL, Analog IP)   

   * Digital Circuits and Digital Signal Processing   

   * Biomedical Circuits and System   

   * Power Electronics   

   * VLSI Architecture

SUBMISSION
Authors are required to send their manuscripts written in English within 4-6 pages, along with information which includes the complete title, author name(s), affiliation(s) of author(s), and corresponding author (name, postal and e-mail addresses, telephone/fax numbers), via online submission at our website (to be announced) by June 10, 2011. After peer reviewing by experts, notification of acceptance will be sent via e-mail by August, 2011.

Camera ready manuscript should be prepared in the workshop format which is provided on the website. The deadline for camera-ready manuscript submission is August 19, 2011. At least one of the authors must register by September 2, 2011. Otherwise the paper will not be included in the workshop proceedings. It is mandatory that all accepted papers must be presented at the workshop.

IMPORTANT DATES
Deadline for Paper Submission : June 10, 2011
Notification of Acceptance : August 1, 2011
Deadline of Camera Ready Manuscript Submission : August 19, 2011
Deadline for Author Registration : September 2, 2011
Deadline for Early Registration (Non-Authors) : September 30, 2011

CONTACT PERSON
General Secretary: EVA MUCHTAR (Bandung Institute of Technology)
secretary@avw2011.stei.itb.ac.id

TPC Secretary: MICHITAKA YOSHINO (Hosei University)
michitaka.yoshino.43@adm.hosei.ac.jp 

*) Please contact TPC Secretary for technical matter, and ask other else to General Secretary.

Tuesday, May 3, 2011

Debugging di Eclipse: Memeriksa Element Pointer Array

Sebagai IDE, Eclipse bisa digunakan sebagai editor, builder/compiler, sekaligus debugger. Debugger di Eclipse berbasiskan GDB (GNU Debugger). Pada awalnya, GDB dibuat oleh Richard Stallman, penggagas open source software. Debugging menggunakan GDB saja tidak cukup, terutama karena set breakpoint pada GDB kurang intuitif, dan GDB tidak bisa menampilkan perjalanan step proses pada source code, ini juga berhubungan erat dengan intuisi debugging. Oleh karena itu, diperlukan front-end tools yang berbasis GDB untuk debugging, salah satunya Eclipse.

Sebagaimana layaknya tools GUI debugger, Eclipse menyediakan window khusus untuk menampilkan variable-variable dan nilainya. Bahkan jika nilai dalam variable berubah, Eclipse langsung memberikan tanda kuning pada variable tersebut, agar lebih eye catching. Tapi tetap saja debugging di Eclipse tidak se-"handy" Matlab, terutama karena ada tipe variabel yang nilainya tidak bisa langsung dilihat dengan mudah, yaitu pada kasus pointer. 


Jika pointer dimanfaatkan sebagai array, nilai masing-masing element dalam array tidak bisa terlihat dalam variable browser Eclipse. Berbeda jika array dibuat menggunakan static array. 

Untuk bisa memeriksa nilai element dalam pointer array, buka console GDB. Lalu ketikkan perintah GDB berikut.

print *([nama_pointer]+[index_awal])@[jumlah_element_yg_diperiksa]

Misalnya:


int *array;
array = malloc(5 * sizeof(int));
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

Maka, untuk melihat nilai element array data, sejumlah 5 element, ketikkan perintah berikut di console GDB Eclipse:


print *(array)@5

Bisa juga disingkat menjadi:

p *(array)@5

Berikut contoh beberapa command untuk memeriksa nilai element array (real case).

1. Memeriksa nilai array mulai index pertama sampai sejumlah 5 element array.

p *code_deconcat1_row.data@5

2. Memeriksa nilai array mulai index kedua.

p *(code_deconcat1_row.data+2)

3. Memeriksa nilai array mulai index kedua sampai sejumlah 4 element array.

p *(code_deconcat1_row.data+2)@4

Selamat mencoba =)



Wednesday, April 13, 2011

Karakteristik Kualitas Code (Software Engineering, dll.)


Software Quality Assurance 

Quality assurance (QA) merupakan hal yang biasa dan ada di segala bidang industri; mulai dari industri besar seperti industri pesawat terbang, sampai industri kecil seperti industri pakaian. Tak kalah dengannya,  software engineering, bahkan quality assurance menjadi hal pokok dan penting dalam software engineering. Buku "Code Complete: A Handbook of Software Construction" membahas mendetail mengenai bagaimana membuat software yang berkualitas, bukan bagaimana membuat software dengan bahasa ini, teknik itu, dan sebagainya. Quality bisa dipandang dalam dua sisi: eksternal dan internal. Berikut beberapa cuplikan yang diambil dari buku tersebut, mengenai karakteristik kualitas software baik dari sisi eksternal maupun internal.

Karakteristik Kualitas Eksternal

Correctness. The degree to which a system is free from faults in its specification, design, and implementation.

Usability. The ease with which users can learn and use a system.

Efficiency. Minimal use of system resources, including memory and execution time.

Reliability. The ability of a system to perform its required functions under stated conditions whenever required—having a long mean time between failures.

Integrity. The degree to which a system prevents unauthorized or improper access to its programs and its data. The idea of integrity includes restricting unauthorized user accesses as well as ensuring that data is accessed properly—that is, that tables with parallel data are modified in parallel, that date fields contain only valid dates, and so on.

Adaptability. The extent to which a system can be used, without modification, in applications or environments other than those for which it was specifically designed.

Accuracy. The degree to which a system, as built, is free from error, especially with respect to quantitative outputs. Accuracy differs from correctness; it is a determination of how well a system does the job it’s built for rather than whether it was built correctly.

Robustness. The degree to which a system continues to function in the presence of invalid inputs or stressful environmental conditions. 

Karakteristik Kualitas Internal

Maintainability. The ease with which you can modify a software system to change or add capabilities, improve performance, or correct defects.

Flexibility. The extent to which you can modify a system for uses or environments other than those for which it was specifically designed.

Portability. The ease with which you can modify a system to operate in an environment different from that for which it was specifically designed.

Reusability. The extent to which and the ease with which you can use parts of a system in other systems.

Readability. The ease with which you can read and understand the source code of a system, especially at the detailed-statement level.

Testability. The degree to which you can unit-test and system-test a system; the degree to which you can verify that the system meets its requirements.

Understandability. The ease with which you can comprehend a system at both the system-organizational and detailed-statement levels. Understandability has to do with the coherence of the system at a more general level than readability does.

Dari beberapa karakteristik tersebut, terdapat beberapa point yang mirip-mirip tetapi berbeda makna dan tujuannya. Pada beberapa kasus, point yang satu lebih tepat dari point selainnya, begitu juga sebaliknya. Bahkan mungkin ada beberapa karakteristik internal yang sepertinya overlap dengan karakteristik eksternal, namun berbeda aplikasinya.

Secara umum, pengguna (user) hanya peduli dengan karakteristik eksternal saja, apakah code tersebut mudah digunakan, apakah mudah dimodifkasi, dan sebagainya. Mereka tidak peduli apakah struktur code sudah baik, atau mudah dibaca. Sebaliknya, bagi programmer, yang penting adalah bagaimana proses development mereka berjalan mulus, yaitu dengan membuat code yang berkualitas dari sisi struktur yang baik, kemudahan dibaca, kemudahan didebug, dan sebagainya. 

Quality assurance memandang keduanya penting, namun pada aplikasinya, tentu harus dilihat dulu mana yang lebih prioritas, karena project yang satu dengan yang lain berbeda kebutuhannya. Namum daftar karakteristik diatas bisa jadi rujukan dan entry point, bagaimana membuat rencana dan arahan quality yang akan dibangung pada project tersebut. Oh iya, satu lagi, karakteristik kualitas ini juga bisa diapllikasikan dalam development model dan hardware, karena pada prinspinya, keduanya juga menggunakan bahasa pemrograman (code). (Ya2n)

Thursday, April 7, 2011

Plugin Eclipse IDE untuk Desain dan Verifikasi (DVT)



Salah satu IDE (Integrated Development Environment) favorit saya adalah Eclipse, karena support untuk banyak bahasa, banyak plugin yang bisa diinstall dan developmentnya masih berjalan terus. Fitur yang dimiliki Eclipse diantaranya: syntax highlighting, code completing, automatic indention, dan tentunya debugging environment. Bahasa pemrograman yang disupport mulai dari  mulai dari Java, C/C++, SystemC, Python, sampai bahasa spesifik untuk Desain dan Verifikasi Chip seperti Verilog, VHDL, SystemVerilog, bahkan OVMUVM, dan Cadence e. Untuk memulai memakai Eclipse, install dulu Eclipse-basic package-nya, bisa pakai Eclipse biasa (Java) atau Eclipse CDT (C/C++). Saya memakai Eclipse CDT karena untuk development, saya membutuhkan C/C++, bukan Java.

Tak hanya bahasa pemrograman yang disupport, kelengkapan tools development lainnya seperti SCM (Source Code Management), CVS, SVN, Git, dan segudang tools lainnya (mereka mengklaim ada lebih dari 1000-an tools) yang bisa ditambahkan di Eclipse. Semua ini bisa didapatkan dengan menginstall plugin Eclipse dari website mereka, mereka menyebutnya Eclipse Marketplace. Secara umum, untuk instalasi Plugin Eclipse, tinggal buka Eclipse, klik Help > Install New Software, lalu bubuhkan alamat repository plugin yang ingin diinstall.

Untuk menginstall plugin DVT (Design and Verification) di Eclipse, berikut langkah-langkahnya:
1. Buka Eclipse
2. Klik Help > Install New Software
3. Pada form Work With, tulis: http://dvteclipse.com/update
4. Klik Add
5. Pada form Name, tulis: DVT
6. Klik OK, lalu akan muncul pilihan plugin yaitu: Design and Verification Tools dan Help Plugin.
7. Check-box semua pilihan lalu klik Next, lalu akan mucul summary dari plugin yang akan diinstal (seperti pada gambar diatas).
8. Klik Next, untuk membaca License Agreement, dan pilihkan I accept the term and license agreement
9. Klik Finish dan tunggu proses intalasi selesai. 
10. Restart Eclipse untuk mulai memakai tools DVT. 

Referensi selengkapnya bisa dilihat di Eclipse Marketplace atau DVT Eclipse.
Selamat mencoba! =) (ya2n)

Thursday, March 31, 2011

Mengenal GPU dan CUDA

Beberapa dekade terakhir nama GPU (Graphic Processing Unit) mencuat. GPU pada awalnya dipakai sebagai accelerator untuk pemrosesan grafis pada komputer yang biasanya paling banyak dimanfaatkan oleh aplikasi game. Namun pada perkembangannya, GPU mulai dilirik sebagai accelerator untuk pemrosesan algoritma yang lebih umum, seperti komputasi numerik, realtime medical imaging, komputasi bioinfiormatika, embedded system, dan lainnya. GPU jenis ini dikenal dengan nama GPGPU (General Purpose GPU). Dalam proses desain chip, terutama yang membutuhkan permodelan realtime seperti wireless system, GPU menjadi solusi menarik untuk mengimplementasikan model dalam realtime dan memverifikasinya.

NVIDIA, sebagai sala satu pengembang GPU, melihat potensi ini kemudian mengembangkan seri-seri GPGPU dengan engine yang bisa diakses secara bebas yaitu CUDA. CUDA (Compute Unified Device Architacture) adalah engine untuk mengakses GPU NVIDIA dan API-nya bisa dipanggil oleh program C secara natural. Klaim dari pihak NVIDIA menyatakan bahwa GPU-card NVIDIA Tesla yang mereka miliki bisa memproses operasi foating-point single precision sampai 1TeraFLOPS.


Apa perbedaan CPU dengan GPU? CPU dan GPU saat ini sama-sama memiliki core processor lebih dari satu (multicore). CPU biasanya maksimal saat ini 4-core processor, atau disebut quad-core, sedangkan GPU bisa mencapai sampai 400-core. Walaupun sama-sama multicore, ada perbedaan mendasar pada paradigma multicore-nya. Kalau CPU adalah MIMD, Multiple-Instruction Multiple-Data, sedangkan GPU adalah SIMD, Single-Instruction Multiple-Data.

Instalasi (Driver, CUDA Toolkit, dan SDK)

Berikut langkah-langkah dalam instalasi GPU NVIDIA. Ada tiga macam yang perlu diinstal: NVIDIA Driver, CUDA toolkit, dan SDK (Software Development Kit). Driver, CUDA tookit, dan SDK bisa didownload di website NVIDIA.

Berikut file-file yang saya download untuk Ubuntu 10.0:

NVIDIA-Linux-x86_64-260.19.44.run
cudatoolkit_3.2.16_linux_64_ubuntu10.04.run
gpucomputingsdk_3.2.16_linux.run

Untuk menginstall NVIDIA Driver, matikan dulu X-servernya, jalankan installernya, lalu aktifkan kembali X-servernya atau bisa juga reboot.

(ALT+F1)
$ sudo su
$ /etc/init.d/gdm stop
$ cd <NVIDIA_Driver_Path>
$ ./NVIDIA-Linux-x86_64-260.19.44.run

$ /etc/init.d/gdm start

Untuk menginstall CUDA toolkit, jalankan instaler sebagai root.

$ sudo su
$ ./cudatoolkit_3.2.16_linux_64_ubuntu10.04.run

Disini akan ditanya dimana CUDA akan diinstal, defaultnya diinstall di /usr/local/cuda, tapi bisa juga diset untuk diinstall ditempat lain misalnya /opt/cuda. Setelah installasi selesai, set variable PAT dan LD_LIBRARY_PATH mengarah ke tempat instalasi CUDA. Edit file ~/.bashrc dan tambahkan line berikut (asumsi CUDA diinstall di /usr/local/cuda), lalu eksekusi ~/.bashrc tersebut.

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=/usr/local/cuda/lib

$ source ~/.bashrc

Jika instalasi berhasil, compiler bawaan CUDA (nvcc) sudah bisa dijalankan. Buat  hello world biasa dalam bahasa C,dan coba compile dan jalankan hello worldnya.

$ nvcc –o hello hello.c
$ ./hello
Hello

Compiler CUDA (nvcc) bekerja sama persis dengan gcc, apabila extension filenya adalah .c. Agar code dianggap sebagai CUDA code, ubah extensionya menjadi .cu. Penjelasan lebih lanjut mengenai ini bisa disimak pada bagian “Hello World” dalam artikel ini.

Untuk instalasi SDK, jalankan installer sebagai root.

$ sudo su
$ ./gpucomputingsdk_3.2.16_linux.run

Ketika installasi, lokasi instalasi CUDA toolkit akan diminta. Pada proses intalasi (terutama Ubuntu), akan ditemui beberapa masalah, terutama masalah library. Biasanya ada dua library yang perlu ditambahkan, yaitu library X Windows dan OpenGL (lXi, dan lglut).

$ sudo apt-get install libXi-dev libglut3 libglut3-dev

OK, SDK sudah terinstall dan siap digunakan. Untuk mencobanya, masuk ke directory /C/src, copy project template, compile dan jalankan binary-nya, kalau berhasil, kalimat “Test PASSED” akan muncul.

$ cd /C/src
$ cp –r template coba
$ cd coba
$ make
$ ../../bin/linux/release/template
Test PASSED

Pada beberapa kasus, muncul error linker. Kasus yang sering muncul adalah:
 
/usr/bin/ld: cannot find -lshrutil_x86_64
/usr/bin/ld: cannot find -lcutil_x86_64
/usr/bin/ld: cannot find -lglut
/usr/bin/ld: cannot find -lGL

Berikut solusi-solusinya:

ERROR: /usr/bin/ld: cannot find -lshrutil_x86_64
Cek dulu, seharusnya library -lshrutil_x86_64 ada di /shared/lib, kalau belum ada bisa di-create ulang:

$ cd /shared
$ make


ERROR: /usr/bin/ld: cannot find -lcutil_x86_64
Cek dulu, seharusnya library -lcutil_x86_64 ada di /C/lib, kalau belum ada bisa di-create ulang:

$ cd /C
$ make

ERROR: /usr/bin/ld: cannot find -lglut
ERROR: /usr/bin/ld: cannot find -lGL
Berarti library OpenGL belum tersedia, untuk Ubuntu jalankan command berikut:

$ sudo apt-get install libglut3 libglut3-dev

Lalu tapi ada sedikit tweak untuk Ubuntu, yaitu kalau masih ada error /usr/bin/ld: cannot find -lGL, artinya library /usr/lib/libGL.so broken (lihat http://ubuntuforums.org/showthread.php?t=1480282). Solusinya, delete file /usr/lib/libGL.so, lalu buat link dari /usr/lib/libGL.so.1
 
$ rm /usr/lib/libGL.so
$ ln -s /usr/lib/libGL.so.1 /usr/lib/libGL.so

Sampai disini installasi sudah selesai semua, Driver, CUDA toolkit, dan SDK. Kita bisa coba lagi menjalankan program template.

$ cd /C/src
$ cp –r template coba
$ cd coba
$ make
$ ../../bin/linux/release/template
Test PASSED

CUDA Hello World (First Program)

#include
#include

int main(int argc, char *argv[])
{
    printf("Hello\n");
    return 0;
}

Program hello world dalam C sudah dicoba pada bagian instalasi, dan bisa berjalan dengan baik, karena ketika program hello world tersebut dijalankan, eksekusi hanya dilakukan pada CPU. Kita akan sedikit memodifikasi code hello world sebelumnya, dengan menambahkan dua hal:
  • Fungsi kosong bernama kernel() dengan quaifier __global__
  • Call ke fungsi kosong kernel(), dengan imbuhan <<<1, 1>>>


#include
#include
#include "cuda.h"

__global__ void kernel(void) {
}

int main(int argc, char *argv[])
{
    kernel<<<1,1>>>();
    printf("Hello\n");
    return 0;
}

CUDA menambahkan qualifier __global__ pada standard C. Qualifier ini akan memberitahu compiler bahwa eksekusi fungsi didalam __global__ dilakukan di device (GPU), bukan di host (CPU). Call ke fungsi kernel menggunakan imbuhan <<<1, 1>>> untuk memberitahu, bagaimana fungsi kernel dijalankan di device (GPU). Compile code diatas, dan jalankan programnya, maka akan keluar hasil yang sama, yaitu “Hello”, sama persis dengan sebelum dimodifikasi, karena memang fungsi di GPU kosong. Sekarang kita coba tambahkan fungsi sederhana yang dijalankan di GPU, yaitu fungsi penjumlahan.

#include
#include
#include "cuda.h"

__global__ void add( int a, int b, int *c ) {
    *c = a + b;
}

int main(int argc, char *argv[])
{
    int c;
    int *dev_c;
 
    cudaMalloc( (void**)&dev_c, sizeof(int) );   
    add<<<1,1>>>( 2, 7, dev_c ); 
    cudaMemcpy( &c,  dev_c,  sizeof(int),  cudaMemcpyDeviceToHost );
    printf( "2 + 7 = %d\n", c );
    cudaFree( dev_c );
}

Compile code-nya, lalu jalankan programnya.

$ nvcc -o hello hello.cu
$ ./hello
2 + 7 = 9


Voila! selamat mencoba! (Ya2n)

Tuesday, March 15, 2011

Design hierarki sistem menggunakan TLM-2.0

TLM (Transaction Level Modeling) adalah tools yang disediakan SystemC untuk memodelkan komunikasi antar modul dalam system, baikan dalam hardware, software, ataupun komunikasi yang melibatkan hardware software. TLM memungkinkan kita modelkan sistem dilakukan dengan cepat. Salah satu hal penting yang kita butuhkan dalam memodelkan sistem adalah kemampuan merepresentasikan hierarchy. Berikut sedikit pengenalan bagaimana membuat desain hierarchy dalam SystemC TLM-2.0.  

Initiator dan target

Dalam TLM, kita mengenal istilah initiator dan target. Initiator adalah modul yang menginisiasi/mengawali transaksi, sedangkan target adalah yang menerima transaksi. Gambaran umumnya adalah seperti CPU menulis data ke RAM, dimana CPU adalah initiator, dan RAM adalah target. Initiator bisa dibungkus oleh modul initiator yang lain, begitu pula dengan target. Ini berguna jika ingin membuat desain dengan granularity yang jelas. 


Desain hierarchy pada gambar diatas dapat dibuat menggunakan library tlm_initiator_socket dan tlm_target_socket  dari tlm core interface. Kalau memakain tlm_utils, jangan lupa definisikan SC_INCLUDE_DYNAMIC_PROCESSES.

#define SC_INCLUDE_DYNAMIC_PROCESSES
#include "systemc.h"
#include "tlm/tlm.h"

struct initiator : sc_module {
tlm::tlm_initiator_socket<> init_socket;
SC_CTOR(initiator) : init_socket("init_socket")
{}
};

struct target : sc_module {
tlm::tlm_target_socket<> targ_socket;
SC_CTOR(target) : targ_socket("targ_socket")
{}
};

struct parent_of_initiator : sc_module {
tlm::tlm_initiator_socket<> init_socket;
initiator *INITIATOR;
SC_CTOR(parent_of_initiator) : init_socket("init_socket")
{
INITIATOR = new initiator("INITIATOR");
        INITIATOR->init_socket.bind(init_socket);
}
};

struct parent_of_target : sc_module {
tlm::tlm_target_socket<> targ_socket;
target *TARGET;
 SC_CTOR(parent_of_target) : targ_socket("targ_socket")
{
TARGET = new target("TARGET");
        targ_socket.bind(TARGET->targ_socket);
}
};

struct parent_of_initator_and_target : sc_module
{
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
initiator *INITIATOR;
target *TARGET;
SC_CTOR(parent_of_initator_and_target) : init_socket("init_socket"), targ_socket("targ_socket")
{
INITIATOR = new initiator("INITIATOR");
TARGET = new target("TARGET");
  INITIATOR->init_socket.bind(init_socket);
  targ_socket.bind(TARGET->targ_socket);
}
};


Sebuah initiator juga bisa berfungsi sekaligus sebagai target. Ini sangat diperlukan ketika memodelkan interconnect component. Berikut implementasinya menggunakan simple_initiator_socket dan simple_target_socket.

struct initiator_target : sc_module {
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
 SC_CTOR(initiator_target) : init_socket("init_socket"), targ_socket("targ_socket")
{}
};

struct parent_of_initiator_target : sc_module
{
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
initiator_target *INITIATOR_TARGET;
SC_CTOR(parent_of_initiator_target): init_socket("init_socket"), targ_socket("targ_socket")
{
INITIATOR_TARGET = new initiator_target("INITIATOR_TARGET");
INITIATOR_TARGET->init_socket.bind(init_socket);
  targ_socket.bind(INITIATOR_TARGET->targ_socket);
}
};

TLM library dan source code pada contoh ini bisa didownload pada halaman Download. Sampai jumpa di tutorial TLM selanjutnya... Selamat mencoba.. ^^ (Ya2n)