2017-09-09 21 views
5

Chúng tôi cho phép một vectơ ở một vài nơi và chúng tôi cần giá trị 0 phân biệt để sử dụng với tích hợp vec_perm. Chúng tôi đã không thể tìm được một số vec_zero() hoặc tương tự, vì vậy chúng tôi muốn biết cách chúng tôi nên xử lý mọi thứ.Cách lấy giá trị VSX bằng 0?

Mã hiện sử dụng hai chiến lược. Chiến lược đầu tiên là một tải vector:

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

Chiến lược thứ hai là một xor sử dụng mặt nạ, chúng tôi có ý định sử dụng:

chuẩn
__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

Chúng tôi chưa bắt đầu (chưa), vì vậy chúng tôi không biết nếu cái nào tốt hơn cái kia. Chiến lược đầu tiên sử dụng tải VMX và có thể tốn kém. Chiến lược thứ hai tránh được tải nhưng giới thiệu một sự phụ thuộc dữ liệu.

Làm cách nào để có được giá trị VSX bằng 0?

+0

Nếu bạn chỉ khởi biến vector bằng không theo cách thông thường (lưu ý rằng có hai cú pháp khác nhau cho điều này, tùy thuộc vào trình biên dịch bạn đang sử dụng) thì trình biên dịch sẽ thường chọn phương pháp nào hiệu quả hơn để tách không cho vectơ. –

+0

Tất nhiên, bạn có thể sử dụng dạng vec_splat ngay lập tức cho số không và các giá trị nhỏ khác. –

Trả lời

1

Tôi khuyên bạn nên để trình biên dịch xử lý nó cho bạn. Chỉ cần khởi tạo không:

const uint8x16_p8 zero = {0}; 

- có khả năng sẽ biên dịch thành xor.

Ví dụ, một thử nghiệm đơn giản:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

Trên máy tính của tôi, đây biên dịch để:

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ... 
Các vấn đề liên quan