ขณะนี้ Vc อยู่ในโหมดการบำรุงรักษาและไม่ได้รับการพัฒนาอีกต่อไป อย่างไรก็ตาม เรายังคงตรวจสอบคำขอดึงข้อมูลพร้อมการแก้ไขข้อบกพร่องจากชุมชนต่อไป
คุณอาจสนใจที่จะเปลี่ยนไปใช้ std-simd GCC 11 มี std::simd
เวอร์ชันทดลองเป็นส่วนหนึ่งของ libstdc++ ซึ่งใช้ได้กับ clang เช่นกัน คุณสมบัติที่มีอยู่ใน Vc 1.4 และไม่มีอยู่ใน std-simd จะเปลี่ยนเป็น Vc 2.0 ในที่สุดซึ่งขึ้นอยู่กับ std-simd
โดยเฉพาะ CPU และ GPU รุ่นล่าสุด ต้องใช้รหัสข้อมูลคู่ขนานเพื่อประสิทธิภาพสูงสุด ความขนานของข้อมูลต้องการให้ใช้ลำดับการดำเนินการเดียวกันกับข้อมูลอินพุตที่แตกต่างกัน ดังนั้น CPU และ GPU จึงสามารถลดฮาร์ดแวร์ที่จำเป็นสำหรับการถอดรหัสและกำหนดเวลาคำสั่ง เพื่อรองรับหน่วยทางคณิตศาสตร์และลอจิกที่มากขึ้น ซึ่งดำเนินการคำสั่งเดียวกันพร้อมกัน บนสถาปัตยกรรม CPU จะมีการใช้งานผ่านการลงทะเบียน SIMD และคำแนะนำ รีจิสเตอร์ SIMD เดียวสามารถจัดเก็บค่า N และคำสั่ง SIMD เดียวสามารถดำเนินการการดำเนินการ N กับค่าเหล่านั้นได้ บนสถาปัตยกรรม GPU เธรด N ทำงานด้วยการซิงค์ที่สมบูรณ์แบบ ป้อนโดยตัวถอดรหัส/ตัวกำหนดเวลาคำสั่งเดียว แต่ละเธรดมีหน่วยความจำภายในและดัชนีที่กำหนดเพื่อคำนวณออฟเซ็ตในหน่วยความจำสำหรับการโหลดและการจัดเก็บ
คอมไพเลอร์ C++ ปัจจุบันสามารถทำการแปลงรหัสสเกลาร์เป็นคำสั่ง SIMD ได้โดยอัตโนมัติ อย่างไรก็ตาม คอมไพลเลอร์ต้องสร้างคุณสมบัติที่แท้จริงของอัลกอริทึมที่สูญหายไปเมื่อนักพัฒนาเขียนการใช้งานแบบสเกลาร์ล้วนๆ ใน C++ ด้วยเหตุนี้ คอมไพเลอร์ C++ จึงไม่สามารถเวกเตอร์โค้ดใดๆ ให้กับตัวแปรข้อมูลคู่ขนานที่มีประสิทธิภาพสูงสุดได้ โดยเฉพาะอย่างยิ่ง data-parallel loop ที่ใหญ่กว่าซึ่งครอบคลุมหลายฟังก์ชันหรือแม้แต่หน่วยการแปล มักจะไม่ถูกแปลงเป็นโค้ด SIMD ที่มีประสิทธิภาพ
ไลบรารี Vc มีลิงก์ที่ขาดหายไป ประเภทของมันทำให้สามารถระบุการดำเนินการข้อมูลแบบขนานได้อย่างชัดเจนบนค่าหลายค่า ความเท่าเทียมจึงถูกเพิ่มเข้ามาผ่านระบบพิมพ์ แนวทางการแข่งขันระบุความเท่าเทียมผ่านโครงสร้างการควบคุมใหม่และผลที่ตามมาคือความหมายใหม่ภายในเนื้อความของโครงสร้างการควบคุมเหล่านี้
Vc เป็นไลบรารีซอฟต์แวร์ฟรีที่ช่วยให้โค้ด C++ เป็นเวกเตอร์ได้ง่าย มี API ที่ใช้งานง่ายและมอบความสามารถในการพกพาระหว่างคอมไพเลอร์และเวอร์ชันคอมไพเลอร์ต่างๆ รวมถึงความสามารถในการพกพาระหว่างชุดคำสั่งเวกเตอร์ต่างๆ ดังนั้น แอปพลิเคชันที่เขียนด้วย Vc จึงสามารถคอมไพล์ได้สำหรับ:
หลังจากที่ Intel ยกเลิกการรองรับ MIC ด้วย ICC 18 แล้ว Vc 1.4 ก็ลบการสนับสนุนออกไปด้วย
std::vector<Particle>
simdize
d วนซ้ำ std::vector<float>
จำนวนมาก โปรดทราบว่าแฟล็ก -march
มีความสำคัญเพียงใด เมื่อเปรียบเทียบกับแบบธรรมดา -mavx2 -mfma
เริ่มจากโค้ดสำหรับคำนวณผลิตภัณฑ์สเกลาร์ 3 มิติโดยใช้บิวด์อินโฟลต:
using Vec3D = std::array< float , 3 >;
float scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
เมื่อใช้ Vc เราสามารถกำหนดเวกเตอร์โค้ดได้อย่างง่ายดายโดยใช้ประเภท float_v
:
using Vc::float_v
using Vec3D = std::array<float_v, 3 >;
float_v scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
ข้อมูลข้างต้นจะปรับขนาดเป็น 1, 4, 8, 16 และอื่นๆ ผลิตภัณฑ์สเกลาร์ที่คำนวณแบบขนาน ขึ้นอยู่กับความสามารถของฮาร์ดแวร์เป้าหมาย
สำหรับการเปรียบเทียบ การทำเวคเตอร์แบบเดียวกันโดยใช้อินทรินซิกของ Intel SSE นั้นมีรายละเอียดมากกว่า และใช้สัญลักษณ์นำหน้า (เช่น การเรียกใช้ฟังก์ชัน):
using Vec3D = std::array<__m128, 3 >;
__m128 scalar_product (Vec3D a, Vec3D b) {
return _mm_add_ps ( _mm_add_ps ( _mm_mul_ps (a[ 0 ], b[ 0 ]), _mm_mul_ps (a[ 1 ], b[ 1 ])),
_mm_mul_ps (a[ 2 ], b[ 2 ]));
}
ข้อมูลข้างต้นจะไม่ปรับขนาดเป็น AVX, AVX-512 ฯลฯ และไม่สามารถพกพาไปยัง SIMD ISA อื่นๆ ได้
cmake >= 3.0
คอมไพเลอร์ C ++ 11:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
ทางเลือก ระบุไดเร็กทอรีการติดตั้ง:
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
ทางเลือก รวมการสร้างการทดสอบหน่วย:
$ cmake -DBUILD_TESTING=ON ..
บน Windows หากคุณติดตั้ง Visual Studio หลายเวอร์ชัน คุณสามารถเลือกได้หนึ่งเวอร์ชัน:
$ cmake -G " Visual Studio 16 2019 " ..
ดู cmake --help
สำหรับรายการตัวสร้างที่เป็นไปได้
$ cmake --build . -j 16
$ cmake --install . # may require permissions
บน Windows คุณยังสามารถเปิด Vc.sln
ใน Visual Studio และสร้าง/ติดตั้งจาก IDE ได้
เอกสารถูกสร้างขึ้นผ่าน doxygen คุณสามารถสร้างเอกสารประกอบได้โดยการรัน doxygen
ในไดเร็กทอรีย่อย doc
หรือคุณสามารถค้นหาเอกสารประกอบทุกคืนได้ที่:
ดำเนินการบูรณาการฟังก์ชันการทำงานของ Vc ในไลบรารีมาตรฐาน C++
VC ได้รับการเผยแพร่ภายใต้เงื่อนไขของใบอนุญาต BSD 3 ข้อ