CUDA Academy · บทเรียน

สเตนซิลและหน้าต่างเลื่อน

แบ่งบริเวณใกล้เคียงเป็นไทล์พร้อมเซลล์ขอบ

บทเรียน 3 จาก 413 ขั้นตอน

สเตนซิลและหน้าต่างเลื่อน เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

สเตนซิลคืออะไร

สเตนซิลคำนวณผลลัพธ์แต่ละค่าจากบริเวณอินพุตรอบข้างที่กำหนดตายตัว เช่น หาค่าเฉลี่ยของพิกเซลกับเซลล์รอบ ๆ

หน้าต่างเลื่อน

เมื่อเลื่อนไปตามอาร์เรย์ หน้าต่างอินพุตจะเลื่อนไปทีละหนึ่งตำแหน่ง ผลลัพธ์ที่อยู่ติดกันใช้ข้อมูลอินพุตส่วนใหญ่ร่วมกัน จึงนำข้อมูลกลับมาใช้ซ้ำได้มาก

เหมาะอย่างยิ่งกับการใช้ไทล์

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

พบกับฮาโล

ในการคำนวณขอบของไทล์ คุณยังต้องใช้สมาชิกอีกสองสามตัวที่อยู่ด้านนอกเซลล์ขอบพิเศษเหล่านี้เรียกว่าฮาโล

เหตุใดจึงต้องมีฮาโล

เธรดแรกในไทล์ต้องใช้เพื่อนบ้านทางซ้าย ซึ่งอยู่ในไทล์ก่อนหน้า หากไม่มีเซลล์ฮาโล การอ่านนั้นจะผิดพลาด

กำหนดขนาดฮาโล

สำหรับสเตนซิลรัศมี r ให้โหลดเซลล์เพิ่ม r เซลล์ในแต่ละด้าน การทำให้ภาพเบลอแบบ 3 จุดมีรัศมี 1 ดังนั้นมีเซลล์ฮาโลด้านละหนึ่งเซลล์ก็เพียงพอ

ไทล์ที่เติมช่องว่าง

ประกาศหน่วยความจำร่วมให้มีขนาดเท่ากับ blockDim บวก 2 * radius เพื่อให้เก็บทั้งส่วนด้านในและฮาโลสองด้านไว้ในบัฟเฟอร์เดียวอย่างเป็นระเบียบ

__shared__ float tile[BLOCK + 2 * RADIUS];

โหลดส่วนด้านใน

แต่ละเธรดจะโหลดสมาชิกของตนเองลงในไทล์ก่อน โดยวางไว้ที่ออฟเซ็ต radius เพื่อเว้นที่สำหรับฮาโลด้านซ้ายด้านหน้า

tile[threadIdx.x + RADIUS] = in[gid];

โหลดฮาโล

เธรดกลุ่มแรกไม่กี่เธรดทำหน้าที่สองอย่าง โดยดึงเซลล์ฮาโลด้านซ้ายและขวาด้วย ก่อนที่บล็อกจะซิงก์กัน

จากนั้นซิงก์และทำสเตนซิล

หลังจาก __syncthreads แต่ละเธรดจะอ่านเพื่อนบ้านทั้งหมดจากไทล์ โดยไม่แตะหน่วยความจำส่วนกลางอีกในการทำงานขั้นนั้น

ตัวคูณการใช้ซ้ำ

ตอนนี้ค่าแต่ละค่าด้านในถูกใช้สร้างผลลัพธ์2r + 1 ค่า จากการโหลดหน่วยความจำร่วมเพียงครั้งเดียว นี่คือการรับส่งข้อมูลซ้ำซ้อนที่การใช้ไทล์ช่วยกำจัด

ตรวจสอบอย่างรวดเร็ว

เหตุใดสเตนซิลที่ใช้ไทล์จึงต้องมีเซลล์ฮาโล

สรุปทบทวน

สเตนซิลใช้หน้าต่างที่เลื่อนและทับซ้อนกัน ดังนั้นฮาโลที่มีเซลล์เพิ่ม r เซลล์ต่อด้านจึงทำให้ไทล์สร้างผลลัพธ์ทุกค่าได้ โดยโหลดแต่ละค่าครั้งเดียว ✅

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “สเตนซิลและหน้าต่างเลื่อน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สเตนซิลและหน้าต่างเลื่อน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สเตนซิลและหน้าต่างเลื่อน”

แบ่งบริเวณใกล้เคียงเป็นไทล์พร้อมเซลล์ขอบ คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “สเตนซิลและหน้าต่างเลื่อน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม

ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ปัญหาการใช้ข้อมูลซ้ำ
  2. รูปแบบโหลด-ซิงค์-คำนวณ
  3. สเตนซิลและหน้าต่างเลื่อน
  4. จัดการไทล์ริมขอบ
← กลับไปที่ CUDA Academy