การคูณเมตริกซ์ด้วยเมตริกซ์ ตอนที่ 1

ก่อนที่จะคูณเมตริกซ์แบบขนานได้ เราต้องทำความเข้าใจเกี่ยวกับวิธีการคูณเมตริกซ์ ด้วยเมตริกซ์ก่อนครับ

ผมจะลองอธิบายในส่วนที่เกี่ยวข้องนะครับ

หลักการที่สำคัญในการคูณเมตริกซ์ ด้วยเมตริกซ์ นั้นพื้นฐานคือการทำ dot production ของเวกเตอร์แถวกับเวกเตอร์หลักครับ
ผมก็ใช้เวลานานมากกว่าจะทำความเข้าใจได้ (ถ้าเป็นตอนเด็กๆนี่จะคิดได้เร็วกว่านี้ครับ ตอนนี้เริ่ม…)
สมมติเราต้องการหาค่า dot production ของเวกเตอร์ c
กำหนดให้ c=a dot b โดยที่  a=[ 1   2  ] กับ b=[ 3  4 ] นะครับ โดยผลลัพธ์ที่ได้จะมีค่าเป็น scalar ครับ

c  =  1×3 + 2×4  = 3+8 = 11

นี่คือวิธีการหา dot product ครับ คือผลรวม ของการคูณสมาชิกในแต่ละตัว

เอาเป็นว่า ยกตัวอย่าง เมตริกซ์ AxB ขนาด MxM โดย M=2 นะครับ
A =
| 1   2 |
| 3  4  |
B =
| 5  6 |
| 7  8 |

ถ้า C =  A x B แล้ว
C=
| (1×5)+(2×7)   (1×6)+(2×8) |
| (3×5)+(4×7)   (3×6)+(4×8) |
=
|  5+14    6+16 |
| 15+28  18+32|

=
|  19  22  |
|  43  50  |

คราวนี้เรามามองที่สมาชิกแต่ละตัวนะครับ
สมาชิก แถวที่ 1 หลักที่ 1 ของเมตริกซ์ผลลัพธ์(C)  เกิดจาก dot produt ของ เวกเตอร์แถวที่ 1 ของเมตริกซ์ที่ 1(A) แทนด้วย AR_1
กับ เวกเตอร์หลักที่ 1 ของเมตริกซ์ที่ 2(B) แทนด้วย B_C1 ครับ
C(1,1) =  A_R1 dot  B_C1 =
| 1  2 |
dot
| 5 |
| 7 |
= 1×5  + 2×7  = 5 + 14 = 19

ผมทิ้งท้ายไว้แค่นี้ก่อนสำหรับท่านที่เพิ่งเข้ามาอ่าน บทความนี้ยังไม่จบนะครับไว้ผมจะมาเพิ่มเติมต่อในตอนหน้าครับ

Advertisements

การวัดเวลาในภาษาซี ที่ให้ค่า precision สูง

ขออ้างไว้ก่อนว่า วิธีการนี้เป็น platform specific POSIX สำหรับ linux/unix นะครับ สำหรับ window ผมแนะนำดู เว็ปนี้ครับ

ปกติเวลาเราวัดค่า elapsed time สำหรับ appliction ที่ไม่ต้องการ precision สูง เราจะใช้ฟังก์ชั่น clock() ธรรมดา ๆที่ระบุไว้ใน time.h ที่เป็นมาตรฐาน ANSI C แต่จะให้ค่า precision ที่ต่ำมาก(ระดับ milli second) เท่านั้น ถ้าเราต้องการ ความแม่นยำสูงขึ้นเราก็จะต้องมองหาฟังก์ชั่นอื่นมาทดแทน

ในที่นี้เราจะใช้ ฟังก์ชั่น gettimeofday() ซึ่งให้ precision สูงในระดับ microsecond ( 1 / 10^12 second)   ครับ โดย header file ที่ใช้ก็คือ sys/time.h ครับ

ยกตัวอย่าง code เลยนะครับ

#include <stdio.h>
#include <sys/time.h>

void main()
{
     struct timeval t1,t2;

     gettimeofday(&t1, NULL);

     // ประมวลผลบางอย่าง
 gettimeofday(&t2, NULL);
printf("elapsed  = %d seconds , %d microseconds\n", t2.tv_sec- t1.tv_sec
, t2.tv_usec - t1.tv_usec);
}

tv_sec ให้ค่าออกมาเป็น second ครับ
ส่วน tv_usec นั้น precision อยู่ในระรับ micro

คิดว่าคงจะเป็นประโยชน์กับหลายๆท่านที่ต้องการเขียนโปรแกรมที่ต้องการวัดประสิทธิภาพในระดับสูงนะครับ

นี่คือผลลัพธ์ที่ผมได้จาการรันคำสั่ง devi…

นี่คือผลลัพธ์ที่ผมได้จาการรันคำสั่ง deviceQuery ของ CUDA ของเครื่องที่ห้อง Lab ครับ

./deviceQuery Starting…

CUDA Device Query (Runtime API) version (CUDART static linking)

There is 1 device supporting CUDA

Device 0: “GeForce 9300 GE” //รุ่นของการ์ดจอ nVidiaครับ
CUDA Driver Version:                           3.20
CUDA Runtime Version:                          3.20
CUDA Capability Major/Minor version number:    1.1
Total amount of global memory:                 267714560 bytes //global memoryประมาณ 256MB ครับ แต่ memory ทั้งหมดมี 512 MB ไม่รู้ทำไมกำลังหาเหตุผลอยู่
Multiprocessors x Cores/MP = Cores:            1 (MP) x 8 (Cores/MP) = 8 (Cores)
Total amount of constant memory:               65536 bytes //อันนี้ก็ไม่รู้ หน่วยความจำอะไร 64 K
Total amount of shared memory per block:       16384 bytes // หน่วยความจำที่ thread block สามารถอ้างถึงได้ 1 block ประมาณ 16 K
Total number of registers available per block: 8192 // งงครับงง 8K อะไรหนอ
Warp size:                                     32 //นี่ก็งง
Maximum number of threads per block:           512 // 1 block มีได้สูงสุด 512 thread
Maximum sizes of each dimension of a block:    512 x 512 x 64
Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
Maximum memory pitch:                          2147483647 bytes
Texture alignment:                             256 bytes
Clock rate:                                    1.30 GHz //ความเร็วของ processor
Concurrent copy and execution:                 No
Run time limit on kernels:                     Yes //งง
Integrated:                                    No
Support host page-locked memory mapping:       Yes
Compute mode:                                  Default (multiple host threads can use this device simultaneously)
Concurrent kernel execution:                   No
Device has ECC support enabled:                No
Device is using TCC driver mode:               No

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 3.20, CUDA Runtime Version = 3.20, NumDevs = 1, Device = GeForce 9300 GE

PASSED

Press <Enter> to Quit…

การจัดการกับ disk บน linux

( บทความนี้เป็นบันทึกที่ผมเคยโพสต์ไว้ที่อื่นตอนนี้รวบรวมมาไว้ที่เดียวกันและจัดหมวดหมู่อยู่ครับ อาจดูรกๆและเนื้อหาปนๆไปบ้างครับ ^ ^ )

แสดง UUID ของ hard disk ทั้งหมด เพิ่มเติม

sudo blkid

ดูขนาด block size ของ hard disk ที่มี file sytem เป็นแบบ ext2,ext3,ext4

/sbin/dumpe2fs < deviceid > | grep ‘Block size’

การสร้าง file เปล่า ๆ ขนาด 64 k ด้วยคำสั่ง dd (ในที่นี้ใช้ user ที่ชื่อ neptune)

dd  if=/dev/zero   of=/home/neptune/disk1.img  bs=1k  count=64

การสร้าง file system แบบ ext2 ให้กับ file ที่สร้างด้วยคำสั่ง dd
mkfs.ext2 /home/neptune/disk1.img

การ mount file ด้านบนให้สามารถใช้งานได้เหมือน partition อื่นๆ
sudo mount -o loop /home/neptune/disk1.img  /home/neptune/disk1

แสดง partition table
sudo fdisk -l

การ copy MBR

dd if=/dev/sda of=MBR.bin  bs=512 count=1

ใช้คำสั่ง file เพื่อดูข้อมูล

file MBR.bin

ตัวอย่าง output จากคำสั่งข้างบน

MBR.bin: x86 boot sector; GRand Unified Bootloader, stage1 version 0×3, boot drive 0×80, stage2 address 0×2000, stage2 segment 0×200; partition 1: ID=0×7, active, starthead 1, startsector 63, 30716217 sectors; partition 2: ID=0xf, starthead 254, startsector 38416382, 117880003 sectors; partition 3: ID=0×83, starthead 254, startsector 30716280, 7695135 sectors, code offset 0×63

อธิบายเล็กน้อย  boot sector นี้ติดตั้งโปรแกรม bootloader ชื่อ GRand Unified Bootloader(GRUB)  มี 2 stage ด้วยกัน และมี 3 partition โดยที่ partition 1 อยู่ในสถานะ active ซึ่งเมื่อ stage แรกทำงานเสร็จสิ้น ก็จะ load โปรแกรมที่อยู่ใน partition นี้และส่งการควบคุมไปที่โปรแกรมดังกล่าว(boot loader stage 2)

ABI ย่อมาจาก Application Binary Interface เป็นฟังก์ชันสำหรับให้ kernel module ต่างๆ เรียกใช้งานได้

เมื่อใช้คำสั่ง uname -r  จะแสดงหมายเลข version ของ linux  เช่น 2.6.32-24-generic หมายเลข 24 ในที่นี้คือ version ของ ABI นั่นเอง

การ boot linux ผ่าน grub prompt

บางครั้งเราต้องการ ที่ boot linux โดยเลือก kernel ที่จะ boot หรือต้องการใส่ parameter บางอย่าง เช่น single ในกรณี recovery mode

เมื่อเข้าสู่ grub menu ให้พิมพ์ c เพื่อเข้าสู่ grub prompt

grub> insmod  ext2        #กำหนดให้ grub โหลดโมดูล extension2
grub>set root=’(hd0,0)   #กำหนดให้ ตำแหน่ง root partion ที่ diskตัวแรก และ partionที่ 1
grub>linux  /boot/vmlinux-version-generic   root=/dev/sda1   ro quiet #กำหนด root device และ kernel ของ linux ที่จะโหลด รวมถึงโหมดในการ boot เป็น read only และ quiet(เงียบ)
grub>initrd  /boot/initrd-version  #กำหนด initrd image เพื่อโหลดหลังจาก kernel โหลดเสร็จสิ้น
grub>boot   #สั่งให้ grub ทำการ boot

กำหนดให้ firefox เป็น default web browser
sudo update-alternatives –config x-www-browser
There are 3 choices for the alternative x-www-browser (providing /usr/bin/x-www-browser).

Selection    Path                       Priority   Status
————————————————————
* 0            /usr/bin/opera              90        auto mode
1            /usr/bin/chromium-browser   40        manual mode
2            /usr/bin/firefox            40        manual mode
3            /usr/bin/opera              90        manual mode

การ copy แบบ column ใน vim

เข้าโหมด  block-wise พิมพ์  Ctrl+V  เลือก block ที่ต้องการจะ copy แลัว พิมพ์ y( yank)

การติดตั้ง OSCAR 6.0.5 บน Ubuntu10.04ใน

( เนื้อหายังไม่เสร็จสมบูรณ์ อยู่ในระหว่างการอัปเดตข้อมูล )

อ่าน document ของ OSCAR version 6.0.x แล้วพบว่า การติดตั้งนั้นรองรับ debian/ubuntu distro. นอกจากนั้นเครื่องที่เป็น server/master node นั้นต้องเชื่อมต่อ internet ตลอดระยะเวลาการติดตั้ง เนื่องจากต้องใช้ repository จากข้างนอกในการดาวน์โหลดไฟล์ที่จำเป็นในการติดตั้ง(อะไรๆก็ต้องออนไลน์เสมอนะยุคนี้ – -x )

ขั้นตอนการติดตั้ง
1. ติดตั้ง Ubuntu ที่เครื่อง server node (ต้องออนไลน์ด้วย อย่าลืม) พื้นที่ของ disk ที่ต้องเตรียมไว้ในแต่ละส่วนมีดังนี้
– / และ /var อย่างน้อย 4GB
– /var/lib/systemimager จะใช้สำหรับเก็บ image ของ OSCAR

ในส่วนของผมที่ใช้มี disk ขนาด 40 GB ผมแบ่ง / ใช้ 10 GB, /var 10GB , swap ใช้ 512 MB และที่เหลือเป็น /home (ประมาณ 19.5 GB)

2. คอนฟิก repository ที่ใช้ในการ download ไฟล์ต่างๆ ของ OSCAR (online) ในเอกสารแนะนำว่าในการ switch ผู้ใช้ให้มีสิทธิ์เป็น root นั้นควรใช้คำสั่ง su – เพื่อไม่ให้เกิดข้อผิดพลาดขึ้น( su – เป็นการดึง environment ต่างๆของ root เข้ามาใช้ด้วย

2.1 แก้ไขไฟล์ /etc/apt/sources.list โดยเพิ่มบรรทัดนี้ลงไปที่ท้ายไฟล์

2.2 พิมพ์ sudo apttitude update
2.3 ติดตั้ง package ของ OSCAR ใช้คำสั่ง sudo apt-get install oscar  <——————- หา!!!!      ง่ายขนาดนี้เชียว T_T (เคยลงบน Fedora มาก่อน)
2.4 ตรวจสอบไฟล์คอนฟิกของ OSCAR คือ /etc/oscar/oscar.conf

-ในไฟล์นี้มี ตัวแปรให้ config หลายตัว แต่ตัวที่ผม(คิดว่า)น่าจะแก้คือ OSCAR_NETWORK  เนื่องจากเครื่อง server จะมี network interface สองใบ ค่า default จะเป็น eth0 ผมลองเปลี่ยนเป็น eth1 ดู


2.5 รันสคริปต์ ติดตั้งระบบ oscar-config –setup-distro <distro>-<version>-<arch> ถ้าอยากรู้เลข distro ให้ใช้คำสั่ง oscar-config –supported-distros แล้วเลือกให้ถูก(เหอะๆ)
-ผมลองใช้คำสั่ง oscar-config –supported-distros ดูผลลัพธ์จะมี distro ต่างๆให้นำ distro ที่ตรงกับระบบเรามากที่สุดมาใช้ ในที่นี้ของผมจะเป็น ubuntu-8-i386 ซึ่งจะได้ว่าคำสั่งที่ผมจะใช้รันสคริปต์คือ

sudo oscar-config –setup-distro ubuntu-8-i386 (กรรมหรือเปล่าหนอ ผมดันใช้ ubuntu เวอร์ชั่น 10 แหะๆ ลองดูละกันนะ)

3. Network setup การติดตั้งระบบเน็ตเวิร์คสำหรับวง cluster {เนื้อหาเพิ่มเติม}
แก้ไขไฟล์ /etc/hosts โดยเพิ่ม ip ที่เราต้องการใช้ในวง cluster ลงไปสำหรับเครื่อง server

ของผม ใช้
192.168.101.1

ในที่นี้เราต้องเซ็ตเครื่องลูกให้อยู่ในเน็ตเวิร์คที่อยู่ในวงเดียวกันกับ network interface ตัวที่สอง(private network)

4. การติดตั้งวง cluster
4.1 พิมพ์  sudo oscar-config –bootstrap
ไม่ผ่านแล้วครับผม ตอนนี้มันมองหา package ของ oscar ที่อยู่ใน repository ของ ubuntu 10.04 แต่ไม่มี (เนื่องจาก oscar นั้นไม่ support distro ตัวนี้นี่เอง แหะๆ)

ไม่เป็นไรครับ ผิดเป็นครู เดี๋ยวลองใหม่ก็จะรู้เอง