c ++ wrappers สำหรับ simd intrinsics
SIMD (คำสั่งเดียวข้อมูลหลายข้อมูล) เป็นคุณสมบัติของไมโครโปรเซสเซอร์ที่มีมานานหลายปี คำแนะนำของ SIMD ดำเนินการเดียวในชุดของค่าในครั้งเดียวและให้วิธีการเร่งการดำเนินการรหัสอย่างมีนัยสำคัญ อย่างไรก็ตามคำแนะนำเหล่านี้แตกต่างกันระหว่างผู้ขายไมโครโปรเซสเซอร์และคอมไพเลอร์
xsimd ให้วิธีการรวมเป็นหนึ่งเดียวสำหรับการใช้คุณสมบัติเหล่านี้สำหรับผู้เขียนห้องสมุด กล่าวคือช่วยให้การจัดการของชุดตัวเลขที่มีตัวดำเนินการเลขคณิตเดียวกันกับค่าเดียว นอกจากนี้ยังให้การดำเนินการเร่งการใช้งานฟังก์ชั่นทางคณิตศาสตร์ทั่วไปที่ทำงานบนแบตช์
นอกเหนือจาก Xtensor แล้ว XSIMD ได้รับการรับรองจากโครงการโอเพ่นซอร์สที่สำคัญเช่น Mozilla Firefox, Apache Arrow, Pythran และ Krita
โครงการ XSIMD เริ่มต้นด้วยชุดบทความบล็อกโดย Johan Mabille เกี่ยวกับวิธีการใช้ wrappers สำหรับ simd intrinsicts เอกสารสำคัญของบล็อกสามารถพบได้ที่นี่: นักวิทยาศาสตร์ C ++ การออกแบบที่อธิบายไว้ในบทความยังคงอยู่ใกล้กับสถาปัตยกรรมจริงของ XSIMD จนถึงเวอร์ชัน 8.0
ฟังก์ชั่นทางคณิตศาสตร์เป็นการใช้งานที่มีน้ำหนักเบาของอัลกอริทึมที่นำมาใช้ในโครงการ Boost.SIMD ที่เลิกใช้แล้วในขณะนี้
xsimd ต้องการคอมไพเลอร์ที่สอดคล้องกับ C ++ 11 รองรับคอมไพเลอร์ C ++ ต่อไปนี้:
| ผู้ประกอบการ | รุ่น |
|---|---|
| Microsoft Visual Studio | MSVC 2015 อัปเดต 2 ขึ้นไป |
| G ++ | 4.9 ขึ้นไป |
| เสียงดัง | 4.0 ขึ้นไป |
รองรับชุดคำสั่ง SIMD ต่อไปนี้ได้รับการสนับสนุน:
| สถาปัตยกรรม | ส่วนขยายชุดคำสั่ง |
|---|---|
| x86 | SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA3+SSE, FMA3+AVX, FMA3+AVX2 |
| x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F (GCC7 และสูงกว่า) |
| x86 amd | FMA4 |
| แขน | Neon, Neon64, SVE128/256/512 (ขนาดเวกเตอร์คงที่) |
| การใช้เว็บ | wasm |
| RISC-V | RISC-V128/256/512 (ขนาดเวกเตอร์คงที่) |
แพ็คเกจสำหรับ XSIMD มีอยู่ใน Mamba (หรือ Conda) Manager
mamba install -c conda-forge xsimdแพ็คเกจสำหรับ XSIMD มีอยู่ใน Spack Package Manager
spack install xsimd
spack load xsimdคุณสามารถติดตั้งโดยตรงจากแหล่งที่มาด้วย CMake:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install ในการเริ่มต้นใช้งาน xsimd ลองดูเอกสารฉบับเต็ม
http://xsimd.readthedocs.io/
xsimd มีการพึ่งพาตัวเลือกในไลบรารี XTL:
xsimd | xtl (ไม่บังคับ) |
|---|---|
| ผู้เชี่ยวชาญ | ^0.7.0 |
| 12.x | ^0.7.0 |
| 11.x | ^0.7.0 |
| 10.x | ^0.7.0 |
| 9.x | ^0.7.0 |
| 8.x | ^0.7.0 |
จำเป็นต้องมีการพึ่งพา xtl หากคุณต้องการสนับสนุนการทำให้ vectorization สำหรับ xtl::xcomplex ในกรณีนี้คุณต้องสร้างโครงการของคุณด้วยการสนับสนุนการสนับสนุน C ++ 14
เวอร์ชัน 8 ของไลบรารีเป็นการเขียนใหม่ที่สมบูรณ์และมีความแตกต่างเล็กน้อยกับรุ่น 7.x คู่มือการโยกย้ายจะเปิดให้บริการเร็ว ๆ นี้ ในขณะเดียวกันตัวอย่างต่อไปนี้แสดงวิธีการใช้ทั้งสองรุ่น 7 และ 8 ของห้องสมุด?
นี่คือตัวอย่างที่คำนวณค่าเฉลี่ยของสองชุดของค่าจุดลอยตัว 4 คู่โดยสมมติว่าส่วนขยาย AVX ได้รับการสนับสนุน:
# include < iostream >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
int main ( int argc, char * argv[])
{
xs::batch< double , xs::avx2> a = { 1.5 , 2.5 , 3.5 , 4.5 };
xs::batch< double , xs::avx2> b = { 2.5 , 3.5 , 4.5 , 5.5 };
auto mean = (a + b) / 2 ;
std::cout << mean << std::endl;
return 0 ;
} อย่าลืมเปิดใช้งานส่วนขยาย AVX เมื่อสร้างตัวอย่าง ด้วย GCC หรือ Clang สิ่งนี้ทำด้วยธง -mavx บน MSVC คุณต้องผ่าน /arch:AVX ตัวเลือก
ตัวอย่างนี้เอาต์พุต:
( 2.0 , 3.0 , 4.0 , 5.0 )การคำนวณแบบเดียวกันกับการทำงานของเวกเตอร์และใช้ชุดคำสั่งที่มีประสิทธิภาพมากที่สุดที่มีอยู่:
# include < cstddef >
# include < vector >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
using vector_type = std::vector< double , xsimd::aligned_allocator< double >>;
void mean ( const vector_type& a, const vector_type& b, vector_type& res)
{
std:: size_t size = a. size ();
constexpr std:: size_t simd_size = xsimd::simd_type< double >::size;
std:: size_t vec_size = size - size % simd_size;
for (std:: size_t i = 0 ; i < vec_size; i += simd_size)
{
auto ba = xs::load_aligned (&a[i]);
auto bb = xs::load_aligned (&b[i]);
auto bres = (ba + bb) / 2 .;
bres. store_aligned (&res[i]);
}
for (std:: size_t i = vec_size; i < size; ++i)
{
res[i] = (a[i] + b[i]) / 2 .;
}
}การสร้างการทดสอบต้องใช้ cmake
cmake มีให้บริการเป็นแพ็คเกจสำหรับการแจกแจง Linux ส่วนใหญ่ นอกจากนี้พวกเขายังสามารถติดตั้งด้วย conda package manager (แม้ใน Windows):
conda install -c conda-forge cmake เมื่อติดตั้ง cmake แล้วคุณสามารถสร้างและเรียกใช้การทดสอบ:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest ในบริบทของการรวมอย่างต่อเนื่องกับ Travis CI การทดสอบจะทำงานในสภาพแวดล้อม conda ซึ่งสามารถเปิดใช้งานได้ด้วย
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestเอกสารของ XSIMD สร้างขึ้นด้วยเครื่องมือสามอย่าง
ในขณะที่ต้องติดตั้ง Doxygen แยกกันคุณสามารถติดตั้งหายใจได้โดยพิมพ์
pip install breathe นอกจากนี้ยังสามารถติดตั้งด้วย conda
conda install -c conda-forge breatheในที่สุดสร้างเอกสารด้วย
make html จากไดเรกทอรี docs
เราใช้รูปแบบลิขสิทธิ์ที่ใช้ร่วมกันซึ่งช่วยให้ผู้มีส่วนร่วมทุกคนสามารถรักษาลิขสิทธิ์ในการมีส่วนร่วมของพวกเขา
ซอฟต์แวร์นี้ได้รับอนุญาตภายใต้ใบอนุญาต BSD-3-clause ดูไฟล์ใบอนุญาตสำหรับรายละเอียด