12

Chúng tôi đã chuyển một ứng dụng VS2013 C++/MFC sang VS2015 và đang gặp một số vấn đề đáng lo ngại về hiệu suất và mã được tạo bởi trình biên dịch VS2015.log10() hiệu suất trên Visual Studio 2015 chậm hơn rất nhiều so với Visual Studio 2013 cho x86

Lưu ý đây là dành cho x86.

Tốc độ chậm hơn trên các cuộc gọi log10(). Khi lập cấu hình Bản phát hành bản phát hành bằng cách sử dụng lấy mẫu CPU, chúng tôi thấy rằng các cuộc gọi này mất nhiều thời gian hơn so với trước đây. Đi từ ví dụ 49 mẫu trên cùng một hoạt động cho VS2013 đến một con số khổng lồ 7545 mẫu cho cùng một hoạt động trong VS2015. Điều này có nghĩa là chức năng này tăng từ 0,6% tải CPU lên 50% cho ứng dụng được đề cập.

Trong VS2013 profiler cho thấy:

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
__libm_sse2_log10 49 49 0.61 0.61 

Trong VS2015 profiler cho thấy:

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
___sse2_log102 7,545 7,545 50.43 50.43 

Tại sao một tên hàm khác nhau?

Chúng tôi đã xem xét một thời gian ngắn tại hội đồng được tạo cho log10. Vào VS2013, giá trị này chuyển tiếp đến disp_pentium4.inclog10_pentium4.asm. Vào VS2015, điều này khác. Có vẻ như VS2015 quay lại __libm_sse2_log10 trong Gỡ lỗi.

Có thể __sse2_log102 là nguyên nhân của sự khác biệt hiệu suất này không? Chúng tôi đã kiểm tra kết quả đầu ra từ các chức năng gọi đây là những điểm khác biệt trong các điểm nổi.

Chúng tôi đang biên soạn với mục tiêu v140_xp và có các tùy chọn biên dịch sau:

/Yu"stdafx.h" /MP /GS- /GL /analyze- /W4 /wd"4510" /wd"4610" /Zc:wchar_t /Z7 /Gm- /Ox /Ob2 /Zc:inline /fp:fast /D "WINVER=0x0501" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_SCL_SECURE_NO_WARNINGS" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /GR /arch:SSE2 /Gd /Oy /Oi /MT 

Cũng đưa ra ở đây khi xem các thuộc tính:

Optimization

Code generation

Tất cả các thiết lập dự án là tương tự cho cả VS2013 và VS2015. Lưu ý chúng tôi đang sử dụng SSE2 và có mô hình điểm nổi được đặt thành nhanh.

Có ai gặp phải cùng một vấn đề và biết cách khắc phục sự cố này không?

+0

Một điều đáng lưu ý là Microsoft đã viết lại đáng kể thư viện của họ, cf. [bài đăng trên blog này] (http://blogs.msdn.com/b/vcblog/archive/2015/09/25/rejuvenating-the-microsoft-c-c-compiler.aspx), bao gồm cả lib toán học của họ. Viết lại có thể rơi giữa hai phiên bản bạn so sánh. –

+1

Mọi thứ hướng tới việc triển khai "__sse2_log102" trong VS2015 là nguyên nhân, nó chậm hơn so với thực hiện cũ. Nếu chúng ta thay thế cuộc gọi thành "log10()" bằng một cuộc gọi tới ippsLog10_64f_A53, hồi quy hiệu suất này sẽ bị xóa. – nietras

+0

@PeterSchneider Cảm ơn, vâng chúng tôi đã nhận thức được điều này kể từ khi cổng, chúng tôi đã có vấn đề với điểm nổi để định dạng chuỗi, cũng đã được viết lại hoàn toàn. – nietras

Trả lời

5

Đây là nhận xét của tôi là câu trả lời. Có vẻ như VS2015 đã thay đổi việc triển khai log10 trong bản phát hành, nơi nó gọi chức năng __sse2_log102 mới thay vì cũ __libm_sse2_log10 và việc triển khai mới này là nguyên nhân gây ra sự khác biệt lớn về hiệu suất.

Việc khắc phục cho chúng tôi trong trường hợp này là để gọi triển khai có sẵn trong thư viện Nguyên tắc hiệu năng nội dung (IPP). Ví dụ. thay vì gọi:

return log10(v); 

Gọi này để thay thế:

double result; 
ippsLog10_64f_A53(&v, &result, 1); 
return result; 

Điều này dẫn đến các vấn đề hiệu suất biến mất, trên thực tế nó đã nhanh hơn một chút bằng một tuổi IPP 7.0 phát hành. Tuy nhiên, không phải tất cả đều có thể sử dụng và thanh toán cho IPP, vì vậy chúng tôi hy vọng Microsoft sẽ sửa lỗi này.

Dưới đây là phiên bản của VS2015 đã hiển thị vấn đề này.

enter image description here

Các vấn đề liên quan