2015-07-19 13 views
5

Có bao nhiêu chu kỳ đồng hồ chi phí lũy thừa AVX/SSE trên CPU x86_64 hiện đại?Có bao nhiêu chu kỳ xung nhịp có giá trị lũy thừa AVX/SSE trên CPU x86_64 hiện đại?

Tôi về: pow(x, y) = exp(y*log(x))

I.e. làm cả hai hướng dẫn exp()log() AVX x86_64 yêu cầu số chu kỳ nhất định đã biết?

Hoặc số chu kỳ có thể thay đổi tùy thuộc vào mức độ hàm mũ, là có số lượng tối đa chu kỳ có thể chi phí lũy thừa?

+0

Có mức tối đa trên bất kỳ con chip cụ thể nào. Không có thi hành tối đa trên tất cả các kiến ​​trúc thuộc danh mục 'x86_64'. –

+7

Không có lệnh exp và log, đây là các hàm SVML. – harold

+4

Có một [dự án mã nguồn mở] (http://software-lisc.fbk.eu/avx_mathfun/) thực hiện các hàm sin, cos, exp và log bằng cách sử dụng AVX. Từ đó bạn có thể chia nhỏ chúng thành các chỉ dẫn gốc – Alejandro

Trả lời

8

Các x86 SIMD tập lệnh (ví dụ: không x87), ít nhất lên đến AVX2, không bao gồm SIMD exp, log, hoặc pow với ngoại lệ của pow(x,0.5) đó là căn bậc hai.

Tuy nhiên, có các thư viện toán học SIMD được xây dựng từ hướng dẫn SIMD có các chức năng này (trong số các chức năng khác). SVML của Intel bao gồm:

__m256 _mm256_exp_ps(__m256) 
__m256 _mm256_log_ps(__m256) 
__m256 _mm256_pow_ps(__m256, __m256) 

Intel vô tình gọi nội tại khi chúng thực sự hoạt động với một số hướng dẫn. SVML là nguồn đóng và tốn kém. Tuy nhiên, bằng cách tìm kiếm svml sau khi cài đặt thời gian chạy Intel OpenCL, tôi đã tìm thấy một số tệp svml trong các thư mục OpenCL vì vậy tôi nghĩ bạn có thể nhận được SVML gián tiếp thông qua thời gian chạy OpenCL của Intel.

AMD cũng cung cấp một thư viện SIMD toán gọi LibM, đó là nguồn đóng nhưng miễn phí, mà còn có chức năng toán học SIMD riêng của mình:

__m128 amd_vrs4_expf(__m128) 
__m128 amd_vrs4_logf(__m128) 
__m128 amd_vrs4_powf(__m128, __m128) 

Agner Sương mù của Vector Class Library cung cấp một giao diện để SVML và libm. Xem tập tin vectormath_lib.h. Từ đó bạn có thể tìm ra các hàm tương ứng từ SVML và LibM.

Agner cũng cung cấp mã của riêng mình cho các chức năng này mà ông tuyên bố là cạnh tranh với phiên bản Intel và AMD độc quyền. Đối với phiên bản chức năng của Agner, hãy xem trong vectormath_exp.h ví dụ: xem exp_f, log_fpow_template_f và sau đó xem hội đồng được tạo.

Bạn có thể sử dụng các chức năng riêng của SVML, LibM và Agner theo thời gian các chức năng explog. Tuy nhiên, bạn nên biết rằng SVML và LibM không chơi tốt trên phần cứng khác. AMD ví dụ được tối ưu hóa cho FMA4 mà Intel không có (nhưng Intel dự định ban đầu có FMA4 và sau đó thay đổi thành FMA3 đột nhiên sau khi AMD đã lên kế hoạch cho FMA4). Intel appears to do something ummm...well I suggest you read about it.

Vì vậy, nếu bạn thời gian SVML hoặc LibM trên bộ vi xử lý AMD hoặc Intel tương ứng, bạn sẽ có khả năng nhận được kết quả rất khác nhau về hiệu suất (unless you manage to replace Intel's CPU dispatch function). Không giống như GPU, bộ hướng dẫn x86 được cung cấp công khai để bạn có thể tạo các hàm explog của riêng mình và đó là những gì Agner đã làm.


Cập nhật

Glibc 2.22 (mà nên đi ra sớm) có một thư viện vector toán học gọi là libmvec. Dường như nó được bật bắt đầu tại -O1 cùng với -ffast-math-fopenmp. Tôi không chắc chắn lý do tại sao fast-math và OpenMP là cần thiết (đặc biệt trong ví dụ dưới đây như toán học kết hợp là không cần thiết) nhưng cuối cùng cũng có một thư viện toán SIMD trong thư viện chuẩn GNU C.

//gcc ./cos.c -O1 -fopenmp -ffast-math -lm -mavx2 
#include <math.h> 

int N = 3200; 
double b[3200]; 
double a[3200]; 

int main (void) 
{ 
    int i; 

    #pragma omp simd 
    for (i = 0; i < N; i += 1) 
    { 
    b[i] = cos (a[i]); 
    } 

    return (0); 
} 
+0

OpenMP là cần thiết vì 'libmvec' hỗ trợ" cấu trúc SIMD của OpenMP 4.0 ". – MSalters

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