2012-11-16 31 views
6

Giả sử tôi có một vector 2 yếu tố định nghĩa như sau (bằng cách sử dụng cú pháp GCC cho vectơ đóng gói)Computing x^y với intrinsics vector GCC

// packed vector of 2-elements 
typedef double v2d __attribute__((vector_size(sizeof(double)*2))); 

v2d x = ...; 
double y = ...; 

x[0] = pow(x[0], y) 
x[1] = pow(x[1], y) 

Tôi muốn biết nếu có một cách nhanh hơn để làm hai tính toán công suất sử dụng các hoạt động vectơ. Kiến trúc là GCC trên x86-64 và nền tảng mã cụ thể là OK.

+0

Thực hiện một chức năng điện chung là khó khăn vì nó là kể từ khi bạn có thể cần cả 'exp() 'và' log() '. Có thể có quá nhiều phân nhánh để có thể có được tốc độ tăng tốc đáng giá qua vectorizing. Nhưng tôi chỉ suy đoán thôi. – Mysticial

+0

Không, bộ chỉ lệnh SIMD không có bất kỳ thao tác nào cho phép tăng tốc độ pow(). SSE2 chỉ có thêm, phụ, mul, div, max, min và sqrt. Thậm chí không có một hướng dẫn không vectorized cho nó. –

+2

Có thể có một số hy vọng nếu "y" được giới hạn trong int không dấu thay vì gấp đôi. Thật vậy, với thuật toán "thay đổi và nhân" cổ điển, các phần tử của hai vectơ có thể được đánh giá song song. Chỉ cần đoán của tôi. –

Trả lời

5

Có, điều này có thể xảy ra nếu bạn không có trường hợp đặc biệt (số âm, 0, 1, NaN, v.v ...) để đường dẫn mã là tuyến tính.

Here là mã chung cho chức năng pow cho IEEE754 đôi, nó không có cấu trúc vòng lặp, vì vậy nếu bạn tìm ra tất cả các trường hợp đặc biệt, vectơ có vẻ đơn giản. Chúc vui vẻ.

+2

Haha ... Tôi hiểu ý bạn là "vui". :) – Mysticial

1

Bạn có thể lặp trên các yếu tố trực tiếp và với các tùy chọn đúng GCC và ICC sẽ sử dụng một vectorized pow chức năng

#include <math.h> 
typedef double vnd __attribute__((vector_size(sizeof(double)*2))); 

vnd foo(vnd x, vnd y) { 
    #pragma omp simd 
    for(int i=0; i<2; i++) x[i] = pow(x[i], y[i]); 
    return x; 
} 

Chỉ với -O2 ICC tạo đơn giản call __svml_pow2. SVML (Thư viện Math Vector ngắn) là thư viện toán học được vector hóa của Intel. With -Ofast -fopenmp GCC tạo ra chỉ đơn giản là call _ZGVbN2vv___pow_finite.

Clang không vector hóa nó.

https://godbolt.org/g/pjpzFX

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