สเตนซิลและหน้าต่างเลื่อน
แบ่งบริเวณใกล้เคียงเป็นไทล์พร้อมเซลล์ขอบ
สเตนซิลและหน้าต่างเลื่อน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ปัญหาการใช้ข้อมูลซ้ำ
- รูปแบบโหลด-ซิงค์-คำนวณ
- สเตนซิลและหน้าต่างเลื่อน
- จัดการไทล์ริมขอบ