อ่าน 3 นาที
อาร์เรย์ขนาน
ใน ด้านการคำนวณ กลุ่มของ อาร์เรย์คู่ขนาน (หรือที่เรียกว่า โครงสร้างของอาร์เรย์ หรือ SoA) เป็นรูปแบบหนึ่งของ โครงสร้างข้อมูลโดยปริยาย ที่ใช้ อาร์เรย์ หลายตัว เพื่อแทนอาร์เรย์ของ...
อาร์เรย์ขนาน
ในด้านการคำนวณกลุ่มของอาร์เรย์คู่ขนาน (หรือที่เรียกว่าโครงสร้างของอาร์เรย์หรือ SoA) เป็นรูปแบบหนึ่งของโครงสร้างข้อมูลโดยปริยายที่ใช้อาร์เรย์ หลายตัว เพื่อแทนอาร์เรย์ของเรคอร์ด เดียว โดยจะเก็บ อาร์เรย์ ข้อมูลที่เหมือนกัน แยกต่างหาก สำหรับแต่ละฟิลด์ของเรคอร์ด ซึ่งแต่ละอาร์เรย์จะมีจำนวนองค์ประกอบเท่ากัน จากนั้น วัตถุที่อยู่ตำแหน่งดัชนีเดียวกันในแต่ละอาร์เรย์จะเป็นฟิลด์ของเรคอร์ดเดียวโดยปริยาย ตัวชี้จากวัตถุหนึ่งไปยังอีกวัตถุหนึ่งจะถูกแทนที่ด้วยดัชนีของอาร์เรย์ ซึ่งแตกต่างจากวิธีการปกติในการจัดเก็บฟิลด์ทั้งหมดของแต่ละเรคอร์ดไว้ด้วยกันในหน่วยความจำ (หรือที่เรียกว่าอาร์เรย์ของโครงสร้างหรือ AoS) ตัวอย่างเช่น เราอาจประกาศอาร์เรย์ของชื่อ 100 ชื่อ แต่ละชื่อเป็นสตริง และอายุ 100 อายุ แต่ละอายุเป็นจำนวนเต็ม โดยเชื่อมโยงแต่ละชื่อกับอายุที่มีดัชนีเดียวกัน
ตัวอย่าง
ตัวอย่างการใช้แถวขนาน ใน ภาษา C :
int ages [] = { 0 , 17 , 2 , 52 , 25 }; char * names [] = { "None" , "Mike" , "Billy" , "Tom" , "Stan" }; int parent [] = { 0 /*None*/ , 3 /*Tom*/ , 1 /*Mike*/ , 0 /*None*/ , 3 /*Tom*/ };for ( i = 1 ; i <= 4 ; i ++ ) { printf ( "ชื่อ: %s, อายุ: %d, ผู้ปกครอง: %s \n " , names [ i ], ages [ i ], names [ parent [ i ]]); }ในภาษา Perl (โดยใช้แฮชของอาร์เรย์เพื่อเก็บการอ้างอิงไปยังแต่ละอาร์เรย์):
ข้อมูล ของฉัน%data = ( ชื่อ=> [ 'Joe' , 'Bob' , 'Frank' , 'Hans' ], นามสกุล=> [ 'Smith' , 'Seger' , 'Sinatra' , 'Schultze' ], ส่วนสูงเป็นเซนติเมตร=> [ 169 , 158 , 201 , 199 ]);สำหรับ$i ( 0 .. $# { $data { first_name }}) { printf "ชื่อ: %s %s\n" , $data { first_name }[ $i ], $data { last_name }[ $i ]; printf "ส่วนสูงเป็นเซนติเมตร: %i\n" , $data { height_in_cm }[ $i ]; }หรือในภาษา Python :
ชื่อจริง= [ "Joe" , "Bob" , "Frank" , "Hans" ] นามสกุล= [ "Smith" , "Seger" , "Sinatra" , "Schultze" ] ส่วนสูง (หน่วยเป็นเซนติเมตร ) = [ 169 , 158 , 201 , 199 ]สำหรับi ในช่วง( len ( first_names )): พิมพ์( "ชื่อ: %s %s " % ( first_names [ i ], last_names [ i ])) พิมพ์( "ส่วนสูงเป็นเซนติเมตร: %s " % heights_in_cm [ i ])# การใช้ zip: สำหรับfirst_name , last_name , height_in_cm ในzip ( first_names , last_names , heights_in_cm ): พิมพ์( f "ชื่อ: { first_name } { last_name } " ) พิมพ์( f "ความสูงเป็นเซนติเมตร: { height_in_cm } " )ข้อดีและข้อเสีย
อาร์เรย์แบบขนานมีข้อดีในทางปฏิบัติหลายประการเมื่อเทียบกับวิธีการแบบปกติ:
- ในบางกรณี พวกเขาสามารถประหยัดพื้นที่ได้มากโดยการหลีกเลี่ยงปัญหาการจัดเรียงข้อมูล ตัวอย่างเช่น สถาปัตยกรรมบางแบบทำงานได้ดีที่สุดหากจัดเก็บจำนวนเต็ม 4 ไบต์ไว้ที่ตำแหน่งหน่วยความจำที่เป็นพหุคูณของ 4 เสมอ หากฟิลด์ก่อนหน้าเป็นไบต์เดียว อาจทำให้เสียพื้นที่ไป 3 ไบต์ คอมไพเลอร์สมัยใหม่หลายตัวสามารถหลีกเลี่ยงปัญหาดังกล่าวได้โดยอัตโนมัติ แม้ว่าในอดีตโปรแกรมเมอร์บางคนจะประกาศฟิลด์โดยชัดเจนตามลำดับข้อจำกัดการจัดเรียงข้อมูลที่ลดลงก็ตาม
- หากจำนวนรายการมีน้อย ดัชนีของอาร์เรย์อาจใช้พื้นที่น้อยกว่าตัวชี้แบบเต็มอย่างเห็นได้ชัด โดยเฉพาะอย่างยิ่งในสถาปัตยกรรมบางประเภท
- การตรวจสอบฟิลด์เดียวของแต่ละเรคอร์ดในอาร์เรย์ตามลำดับนั้นทำได้อย่างรวดเร็วมากบนเครื่องคอมพิวเตอร์สมัยใหม่ เนื่องจากเป็นการดำเนินการเชิงเส้นในอาร์เรย์เดียว ซึ่งแสดงให้เห็นถึงคุณสมบัติการเข้าถึงข้อมูลในบริเวณใกล้เคียงและการทำงานของแคช อย่างเหมาะสม
- อาจช่วยให้การประมวลผลมีประสิทธิภาพมากขึ้นด้วยคำสั่ง SIMDในสถาปัตยกรรมชุดคำสั่ง บางประเภท
ข้อดีหลายประการเหล่านี้ขึ้นอยู่กับภาษาโปรแกรมและการใช้งานเฉพาะนั้นๆ เป็นอย่างมาก
อย่างไรก็ตาม อาร์เรย์แบบขนานก็มีข้อเสียที่สำคัญหลายประการ ซึ่งเป็นเหตุผลที่อธิบายว่าทำไมจึงไม่นิยมใช้กันโดยทั่วไป:
- การเข้าถึงข้อมูลแบบไม่เรียงลำดับและตรวจสอบหลายฟิลด์ในแต่ละระเบียนจะทำให้ความแม่นยำในการอ้างอิง ลดลงอย่างมาก เนื่องจากอาร์เรย์ต่างๆ อาจถูกจัดเก็บไว้ห่างกันอย่างไม่มีหลักเกณฑ์
- ข้อมูลเหล่านี้บดบังความสัมพันธ์ระหว่างฟิลด์ในระเบียนเดียว (เช่น ไม่มีข้อมูลประเภทที่เชื่อมโยงดัชนีระหว่างฟิลด์เหล่านั้น ทำให้สามารถใช้ดัชนีได้อย่างผิดพลาด)
- พวกมันมีการรองรับภาษาโดยตรงน้อยมาก (โดยทั่วไปแล้วภาษาและไวยากรณ์ของมันไม่ได้แสดงความสัมพันธ์ใดๆ ระหว่างอาร์เรย์ในอาร์เรย์คู่ขนาน และไม่สามารถตรวจจับข้อผิดพลาดได้)
- เนื่องจากกลุ่มของฟิลด์ไม่ใช่ "สิ่งของ" การส่งต่อจึงยุ่งยากและมีโอกาสเกิดข้อผิดพลาดสูง ตัวอย่างเช่น แทนที่จะเรียกฟังก์ชันเพื่อดำเนินการกับเรคอร์ดเดียว (หรือโครงสร้างหรืออ็อบเจ็กต์) ฟังก์ชันนั้นจะต้องรับฟิลด์เป็นอาร์กิวเมนต์แยกกัน เมื่อมีการเพิ่มหรือเปลี่ยนแปลงฟิลด์ใหม่ รายการพารามิเตอร์จำนวนมากจะต้องเปลี่ยนแปลง ในขณะที่การส่งอ็อบเจ็กต์ทั้งหมดจะช่วยหลีกเลี่ยงการเปลี่ยนแปลงดังกล่าวได้อย่างสิ้นเชิง
- การขยายหรือลดขนาดของอาร์เรย์นั้นมีค่าใช้จ่ายสูง เนื่องจากต้องจัดสรรพื้นที่ใหม่ให้กับอาร์เรย์แต่ละชุด อาร์เรย์หลายระดับสามารถช่วยลดปัญหานี้ได้ แต่ส่งผลกระทบต่อประสิทธิภาพเนื่องจาก ต้องมี การอ้างอิง เพิ่มเติม เพื่อค้นหาองค์ประกอบที่ต้องการ
- สิ่งที่แย่ที่สุดก็คือ มันเพิ่มโอกาสที่จะเกิดข้อผิดพลาดอย่างมาก การแทรก การลบ หรือการย้ายข้อมูลใดๆ จะต้องนำไปใช้กับอาร์เรย์ทั้งหมดอย่างสม่ำเสมอ มิฉะนั้นอาร์เรย์จะไม่ซิงโครไนซ์กันอีกต่อไป ซึ่งจะนำไปสู่ผลลัพธ์ที่แปลกประหลาด
ปัญหาเรื่องความเฉพาะที่ของการอ้างอิงที่ไม่ดีสามารถแก้ไขได้ในบางกรณี: หากโครงสร้างสามารถแบ่งออกเป็นกลุ่มของฟิลด์ที่โดยทั่วไปแล้วเข้าถึงพร้อมกันได้ ก็สามารถสร้างอาร์เรย์สำหรับแต่ละกลุ่มได้ และองค์ประกอบของอาร์เรย์จะเป็นเรคอร์ดที่ประกอบด้วยเฉพาะส่วนย่อยของฟิลด์ในโครงสร้างขนาดใหญ่เท่านั้น (ดูการออกแบบที่เน้นข้อมูล ) นี่เป็นวิธีที่มีคุณค่าในการเร่งความเร็วในการเข้าถึงโครงสร้างขนาดใหญ่ที่มีสมาชิกจำนวนมาก ในขณะที่ยังคงเชื่อมโยงส่วนต่างๆ ของโครงสร้างเข้าด้วยกัน ทางเลือกอื่นนอกจากการเชื่อมโยงส่วนต่างๆ เข้าด้วยกันโดยใช้ดัชนีอาร์เรย์คือการใช้การอ้างอิงเพื่อเชื่อมโยงส่วนต่างๆ เข้าด้วยกัน แต่วิธีนี้อาจมีประสิทธิภาพน้อยกว่าทั้งในด้านเวลาและพื้นที่
อีกทางเลือกหนึ่งคือการใช้อาร์เรย์เดียว โดยที่แต่ละรายการเป็นโครงสร้างเรคอร์ด ภาษาโปรแกรมหลายภาษามีวิธีการประกาศเรคอร์ดจริงและอาร์เรย์ของเรคอร์ดเหล่านั้น ในภาษาอื่นๆ อาจสามารถจำลองสิ่งนี้ได้โดยการประกาศอาร์เรย์ขนาด n*m โดยที่ m คือขนาดของฟิลด์ทั้งหมดรวมกัน แล้วบรรจุฟิลด์เหล่านั้นลงในสิ่งที่เทียบเท่ากับเรคอร์ด แม้ว่าภาษานั้นจะไม่มีการรองรับเรคอร์ดโดยตรงก็ตามการเพิ่มประสิทธิภาพของคอมไพเลอร์ บางอย่าง โดยเฉพาะอย่างยิ่งสำหรับโปรเซสเซอร์เวกเตอร์สามารถทำการแปลงนี้โดยอัตโนมัติเมื่อมีการสร้างอาร์เรย์ของโครงสร้างในโปรแกรม
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ อาร์เรย์ขนาน
ใน ด้านการคำนวณ กลุ่มของ อาร์เรย์คู่ขนาน (หรือที่เรียกว่า โครงสร้างของอาร์เรย์ หรือ SoA) เป็นรูปแบบหนึ่งของ โครงสร้างข้อมูลโดยปริยาย ที่ใช้ อาร์เรย์ หลายตัว เพื่อแทนอาร์เรย์ของ...
ข้อดีและข้อเสีย
อาร์เรย์แบบขนานมีข้อดีในทางปฏิบัติหลายประการเมื่อเทียบกับวิธีการแบบปกติ:
ดูเพิ่มเติม
ตัวอย่างในบทความเกี่ยวกับรายการเชื่อมโยง ระบบจัดการฐานข้อมูลแบบคอลัมน์ ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Parallel_array&oldid=1346289196 "