ป้ายกำกับ

แสดงบทความที่มีป้ายกำกับ CS721 Parallel Programming Term 2/2552 แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ CS721 Parallel Programming Term 2/2552 แสดงบทความทั้งหมด

วันศุกร์ที่ 19 กุมภาพันธ์ พ.ศ. 2553

Game of Life #2 Parallel Program

ขั้นตอนการออกแบบโปรแกรม
หลักการทำงานของโปรแกรมแบบ Parallel (Shared Memory)

ในตัวโปรแกรม main() จะทำการวิ่ง loop เพื่อเรียกฟังก์ชั่น process<<<>>>(d_board,maxx,maxy)ซึ่งเป็นฟังก์ชั่นที่ทำงานใน GPU (Kernel Function) โดยใช้หลายๆ thread ทำการเซตค่าตาราง d_board (ตัวแปรใน GPU) ให้เป็น 0 ทุกค่าก่อน แล้วทำการหาผลรวมของจำนวนสมาชิกรอบตัว 8 ทิศทาง จากนั้นทำการเช็คว่าเข้าเงื่อนใขการมีชีวิตอยู่หรือไม่แล้วทำการเซตค่าคืนว่า cell นั้นจะมีชีวิตหรือไม่ ทำการคืนค่ากลับสู่ board (ตัวแปร CPU) โดยการใช้คำสั่ง cudaMemcpy(board,d_board,size,cudaMemcpyDeviceToHost) วน loop จนครบ แล้วจึงแสดงผลด้วยการบันทึกลงสู่ไฟล์ Board_parallel.output มีการใช้ shared memory โดยการมีตัวแปร sboard (ตัวแปรใน GPU) __shared__ int sboard [][] เพื่อทำการเก็บค่าตำแหน่งปัจจุบันในตาราง เมื่อทำการเปรียบเทียบเงื่อนไขการมีชีวิต แล้วจึงทำการสลับค่ากับตาราง board

Source Code


การคอมไพล์โปรแกรม:
พิมพ์คำสั่ง nvcc inputfile.cu –o outputfile
nvcc gol_par.cu -o gol_par


การเรียกใช้งานโปรแกรม:
พิมพ์คำสั่ง ./outputfile





ป้อนค่าเริ่มต้นโปรแกรมดังนี้
• ขนาดของตาราง Board สี่เหลี่ยมจัตุรัส [n]
• ค่า Ramdom Number [n]
• จำลองเวลาในการมีชีวิต Life Time [n]
• เลือกรูปแบบการจัดเก็บไฟล์ [1/2]
1. เก็บทุก Time Step อยู่ที่ไฟล์ RandomBoard_parallel.input
2. เก็บเฉพาะ Final Time Step อยู่ที่ไฟล์ Board_parallel.output



พิมพ์คำสั่งเพื่อเรียกดู file
more RamdomBoard_parallel.input

แสดงข้อมูลที่บันทึกใน file ดังรูป



แหล่งที่เก็บ source code

Server 61.95.208.65 under path file //cs72102/gol_par.cu





Game of Life #1 Sequential Program

หลักการทำงานของโปรแกรมแบบ Sequential
1. ณ จุดที่ cell หนึ่งๆ อยู่ ให้ทำการนับ cell ที่อยู่รอบตัว นั่นคือ 8 ทิศทาง
โดยใช้ฟังก์ชั่น check_arounj(i,j) แล้วเก็บค่าไว้ในตัวแปร num


2. นำค่าที่นับได้ มาเช็คเงื่อนไขในการชีวิตอยู่

- สำหรับเซลที่มีชีวิตอยู่แล้ว มีกฏการเปลี่ยนแปลงดังนี้
1. ถ้าเซลนั้นมีเซลที่มีชีวิตอยู่รอบข้างเพียงหนึ่งเซลหรือไม่มีเลย เซลนั้นจะตาย เพราะความเหงา
2. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอยู่รอบข้างตั้งแต่ 4 เซลขึ้นไป เซลนั้นจะตายเพราะประชากรมากเกินไป
3. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอยู่รอบข้าง 2 ถึง 3 เซล เซลนั้นจะมีชีวิตต่อไป
- สำหรับเซลที่ว่างอยู่ มีกฏการเปลี่ยนแปลงคือ
1. ถ้ามีเซลที่มีชีวิตอยู่รอบๆมัน 3 เซล เซลที่ว่างนั้นจะกลายเป็นมีชีวิต

แสดงค่าความเป็นไปได้ดังตาราง


3. ทำการบันทึกค่าลงตารางที่1(board1) แล้วจำลองการทำงานใน time step ต่อไปแล้วบันทึกลงตารางที่ 2(board2) ดังนั้นเวลาจะเปลี่ยนการแสดงผลก็ทำการสลับตารางกันโดยที่มีการตัวแปร temp มาช่วยสลับค่า

source code



compile program
พิมพ์คำสั่ง nvcc inputfile.cu –o outputfile



run program
พิมพ์คำสั่ง ./outputfile

ป้อนค่าเริ่มต้นโปรแกรมดังนี้
• ขนาดของตาราง Board สี่เหลี่ยมจัตุรัส [n]
• ค่า Ramdom Number [n]
• จำลองเวลาในการมีชีวิต Life Time [n]
• เลือกรูปแบบการจัดเก็บไฟล์ [1/2]
1. เก็บทุก Time Step อยู่ที่ไฟล์ RandomBoard.input
2. เก็บเฉพาะ Final Time Step อยู่ที่ไฟล์ Board.output



พิมพ์คำสั่งเพื่อดูข้อมูลในไฟล์
more RamdomBoard.input



แสดงผลลัพธ์เก็บในไฟล์




แหล่งที่เก็บ source code
server 61.91.208.65 under path //cs72102/par_seq.cu






Project Games of Life

ในการจำลองที่มีชื่อว่า Games of Life ซึ่งได้รับการคิดค้นขึ้นโดยนัก
คณิตศาสตร์ John Conway และตีพิมพ์ใน Scientific American ในปี 1970
เกมส์นี้แสดงการเปลี่ยนแปลงของ cell บนตาราง 2 มิติ ตามจังหวะ
การเดินของเวลาที่เปลี่ยนไปทีละขั้น โดยมีกฏเกณท์ดังนี้คือ
========= R U L E S =======================
- สำหรับเซลที่มีชีวิตอย่่แล้ว มีกฏการเปลี่ยนแปลงดังนี้
1. ถ้าเซลนั้นมีเซลที่มีชีวิตอย่่รอบข้างเพียงหนึ่งเซลหรือไม่มีเลย เซล
นั้นจะตาย เพราะความเหงา
2. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอย่่รอบข้างตั้งแต่ 4 เซลขึ้นไป เซลนั้นจะ
ตายเพราะประชากรมากเกินไป
3. ถ้าเซลนั้นมีเซลที่มีชีวิตอื่นอย่่รอบข้าง 2 ถึง 3 เซล เซลนั้นจะมีชีวิต
ต่อไป
- สำหรับเซลที่ว่างอยู่ มีกฏการเปลี่ยนแปลงคือ
1. ถ้ามีเซลที่มีชีวิตอยู่รอบๆมัน 3 เซล เซลที่ว่างนั้นจะกลายเป็นมีชีวิต

=========== P R O J E C T =====================
ให้สร้างโปรแกรมโดยมีข้อกำหนดดังนี้
• กำหนดให้เซลอยู่ในตารางสองมิติที่เป็นสี่เหลี่มจตุรัส โดยให้ผู้ใช้เป็นผู้
กำหนดขนาดความยาวของด้านกว้าง(หรือยาว)เป็นเท่าใดก็ได้
• ผู้ใช้ต้องสามารถกำหนดให้โปรแกรมกำหนดค่าเริ่มต้นของตารางโดยใช้
วิธีการ Randomโดยกำหนดให้ความน่าจะเป็นที่จะมีเซลที่มีชีวิตและ
เซลที่ว่างอย่่ในตารางนั้นมีค่าเท่ากัน และผู้ใช้ต้องพิมพ์ค่าของตาราง
ตามรูปแบบดังในภาพที่ 1 (ซึ่งเราจะอธิบายในข้อถัดไป) ลงสู่ไฟล์ชื่อ
RandomBoard.input
• ผู้ใช้ต้องสามารถกำหนดให้มีการอ่านค่าเริ่มต้นจากไฟล์ได้ โดยที่ไฟล์
อินพุทจะต้องมีรูปแบบดังในภาพที่ 1 ซึ่งเป็นภาพแสดงค่าของเซลต่างๆ
ในตารางขนาด 4 x 4 โดยที่ X หมายถึงเซลที่มีชีวิตและ – หมาย
ถึงเซลที่ว่าง


ภาพที่ 1
• ผู้ใช้ต้องสามารถกำาหนดจำนวนขั้นของการเปลี่ยนแปลง(เป็นการจำลอง
เวลา)ได้ตามต้องการ
• ผู้ใช้ต้องสามารถเลือกได้ว่าจะให้โปรแกรมพิมพ์ค่าของเซลในตารางลงสู่
ไฟล์(ตามรูปแบบในภาพที่ 1)ในทุกๆขั้นของการเปลี่ยนแปลงหรือในขั้น
สุดท้ายเท่านั้น ในกรณีเขียนข้อมูลทุกขั้น ให้เขียนข้อมูลลงสู่ไฟล์
BoardImmediate.x โดยที่ x หมายถึงค่าขั้นเวลาของตารางนั้น แต่
ถ้าเขียนข้อมูลเฉพาะรอบสุดท้ายก็ให้เขียนสู่ไฟล์ Board.output

=========== E N D P R O J E C T =================

วันพฤหัสบดีที่ 28 มกราคม พ.ศ. 2553

CUDA Programming # 1

2.CUDA #1
จาก sequential program ทำการเปลี่ยนเป็น Parallel แล้วแสดงการทำงานระหว่าง Host และ GPU

[Source Code]


Compile Program
พิมพ์ nvcc ch2.cu – o ch2

Run Program
พิมพ์ ./ch2 แสดงผลลัพธ์


CUDA Programming # 2

3.CUDA #2
จากSequential Code เปลี่ยนให้เป็น Parallel Code แล้วแสดงการทำงานระหว่าง Host และ GPU

[Source Code]

Compile Program
พิมพ์ nvcc ch3v2.cu – o ch3v2

Run Program
พิมพ์ ./ch3v2 แสดงผลลัพธ์

OpenMP Programming

1.เขียนเป็น Parallel แบบ openMP


[Source Code]


Compile Program
พิมพ์ gcc-4.3 –fopenmp ch1Omp3.c – o ch1Omp3

Run Program
พิมพ์ ./ch1Omp3 แสดงผลลัพธ์

วันอาทิตย์ที่ 10 มกราคม พ.ศ. 2553

Run CUDA sdk and write VecAdd program

Exercise 1

ทำการติดตั้ง CUDA sdk ลงบน Server ซึ่งเป็น Ubuntu 9.04
และทำการทดสอบการรัน โปรแกรม VecAdd.cu

Step 1 :: Login Server
  • ทำการ log on to the server ด้วย โปรแกรม putty กำหนด Address เป็น "61.91.208.65" ด้วย login name และ password ที่ได้มา

  • ทำการเปลี่ยน password ใหม่ โดยพิมพ์คำสั่ง: $passwd


      Step 2 :: Install CUDA software & Verify the installation
      ทำการ download program CUDA sdk จาก web site หรือทำการ copy จากแหล่งที่มาใดๆ


      กรณี 1 ทำการ download โดยตรงจาก web site ให้ทำการพิมพ์คำสั่ง :

      กรณี 2 ทำการ copy file sdk มาจากแหล่งอื่น ให้พิมพ์คำสั่ง :

      $cp /tmp/cudasdk_2.3_linux.run /home/cs72102/cudasdk_2.3_linux.run

      (ทำการ copy files จาก /tmp/cudasdk_2.3_linux.run ไปวางที่ /home/cs72102/cudasdk_2.3_linux.run)



      ก่อนการติดตั้งให้ทำการกำหนด values of environment

      1. set path nvcc ด้วยการพิมพ์ :



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



      2. set path library ด้วยการพิมพ์ :



      $export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

      ทำการติดตั้งด้วยการพิมพ์คำสั่ง :


      ในขั้นตอนการติดตั้งเลือก install path files เป็น dafault path files
      ดังนั้นจะเกิด files NVDIA_GPU_Computing_SDK. อยู่ที่ Home user ซึ่งในที่นี้จะอยู่ที่


      $/home/cs72102/NVDIA_GPU_Computing_SDK
      ทำการทดสอบว่า nvcc ทำงานได้หรือไม่ โดยการพิมพ์คำสั่ง :$nvcc -V แสดงผลลัพธ์ตามรูป


      Additional -->Compiling for Hardware Emulation

      สำหรับบางระบบที่ไม่มี CUDA-capable GPU
      จำเป็นต้องสร้าง Emulated สำหรับ Hardware ด้วย
      โดยการไปที่ path file ที่ทำการ install sdk แล้วทำการพิมพ์คำสั่ง :



      $make emu=1

      ซึ่งผลลัพธ์จะไปแทนที่ใน bin/linux/emurelease



      Run "deviceQuery"

      เพื่อแสดงการ์ดจอของเครื่อง server 61.91.208.65

      โดยพิมพ์คำสั่ง :$./deviceQuery Run "bandwidthTest"

      เป็นการแสดงขนาดการส่งข้อมูลระหว่าง device กับ host , หรือ host กับ device , และ device กับ device
      โดยพิมพ์คำสั่ง :$./bandwidthTest


      Step 3 :: Complie & Run Program VecAdd

    1. ทำการเขียนโปรแกรม VecAdd ใน Notepad แล้ว save files เป็น VecAdd.cu
    2. แล้วทำการ upload ไปวางใน server หรือทำการเปิด editor ขึ้นมาแล้วเขียน code ด้วยคำสั่ง:$vim VecAdd.cu

    3. ทำการ compile program ด้วยคำสั่ง :$nvcc -VecAdd.cu

      • ทำการ Run program ด้วยคำสั่ง :$ ./a.out ได้ผลลัพธ์ตามรูป


        Source Code
        [ VecAdd.cu]