Câu hỏi này tiếp tục cho câu hỏi của tôi ở đây (theo lời khuyên của Mystical):
Tiếp tục câu hỏi của tôi, khi tôi sử dụng hướng dẫn đóng gói thay vì hướng dẫn vô hướng, mã sử dụng bản chất sẽ trông rất giống:
for(int i=0; i<size; i+=16) {
y1 = _mm_load_ps(output[i]);
…
y4 = _mm_load_ps(output[i+12]);
for(k=0; k<ksize; k++){
for(l=0; l<ksize; l++){
w = _mm_set_ps1(weight[i+k+l]);
x1 = _mm_load_ps(input[i+k+l]);
y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
…
x4 = _mm_load_ps(input[i+k+l+12]);
y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
}
}
_mm_store_ps(&output[i],y1);
…
_mm_store_ps(&output[i+12],y4);
}
Hiệu suất đo được của hạt nhân này là khoảng 5,6 hoạt động FP mỗi chu kỳ, mặc dù tôi mong đợi nó chính xác gấp 4 lần hiệu suất của phiên bản vô hướng, tức là 4,1,6 = 6,4 FP ops mỗi chu kỳ.
Có tính đến sự di chuyển của hệ số trọng lượng (cảm ơn bạn đã chỉ ra điều đó), lịch trình sẽ như sau:
Có vẻ như lịch trình không thay đổi, mặc dù có thêm lệnh sau movss
thao tác di chuyển giá trị trọng số vô hướng sang thanh ghi XMM và sau đó sử dụng shufps
để sao chép giá trị vô hướng này trong toàn bộ vectơ. Có vẻ như vectơ trọng số đã sẵn sàng để được sử dụng mulps
kịp thời có tính đến độ trễ chuyển đổi từ tải sang miền dấu phẩy động, vì vậy điều này sẽ không phát sinh thêm bất kỳ độ trễ nào.
Các lệnh movaps
(căn chỉnh, đóng gói) addps
và các mulps
hướng dẫn được sử dụng trong hạt nhân này (được kiểm tra bằng mã lắp ráp) có cùng độ trễ và thông lượng như các phiên bản vô hướng của chúng, vì vậy điều này cũng sẽ không phát sinh thêm bất kỳ độ trễ nào.
Có ai có ý kiến về nơi mà chu kỳ bổ sung này cho mỗi 8 chu kỳ được sử dụng, giả sử hiệu suất tối đa mà hạt nhân này có thể nhận được là 6,4 FP ops mỗi chu kỳ và nó đang chạy ở 5,6 FP ops mỗi chu kỳ?
Nhân tiện đây là lắp ráp thực tế trông như thế nào:
…
Block x:
movapsx (%rax,%rcx,4), %xmm0
movapsx 0x10(%rax,%rcx,4), %xmm1
movapsx 0x20(%rax,%rcx,4), %xmm2
movapsx 0x30(%rax,%rcx,4), %xmm3
movssl (%rdx,%rcx,4), %xmm4
inc %rcx
shufps $0x0, %xmm4, %xmm4 {fill weight vector}
cmp $0x32, %rcx
mulps %xmm4, %xmm0
mulps %xmm4, %xmm1
mulps %xmm4, %xmm2
mulps %xmm3, %xmm4
addps %xmm0, %xmm5
addps %xmm1, %xmm6
addps %xmm2, %xmm7
addps %xmm4, %xmm8
jl 0x401ad6 <Block x>
…
shufps
lệnh thêm 1 chu kỳ sau mỗi 1,6 lần lặp?" Đó là một trong những khó khăn ...