2012-04-25 33 views
6

Hướng dẫn SSE của x86-64 ở đâu (hướng dẫn vectơ) hoạt động tốt hơn các hướng dẫn thông thường. Bởi vì những gì tôi thấy là tải thường xuyên và các cửa hàng được yêu cầu để thực hiện các lệnh SSE là vô hiệu hóa bất kỳ lợi ích nào chúng ta có do tính toán vectơ. Vì vậy, ai đó có thể cho tôi một mã SSE ví dụ nơi nó thực hiện tốt hơn so với mã bình thường.Hướng dẫn SSE hoạt động tốt hơn các hướng dẫn thông thường ở đâu

của nó có lẽ bởi vì tôi đang đi qua từng tham số riêng biệt, như thế này ...

__m128i a = _mm_set_epi32(pa[0], pa[1], pa[2], pa[3]); 
__m128i b = _mm_set_epi32(pb[0], pb[1], pb[2], pb[3]); 
__m128i res = _mm_add_epi32(a, b); 

for(i = 0; i < 4; i++) 
po[i] = res.m128i_i32[i]; 

không Có cách nào tôi có thể vượt qua tất cả 4 nguyên tại một đi, tôi có nghĩa là vượt qua toàn bộ 128 byte trong số pa tại một thời điểm? Và chỉ định res.m128i_i32 đến po cùng một lúc?

+1

Về cơ bản, bất cứ khi nào bạn có một tính toán/load-store cực cao tỉ lệ. – Mysticial

+2

Vâng, bạn chắc chắn không muốn sử dụng '_mm_set_epi32()' như thế. Sử dụng '_mm_load_si128()'.Và nếu bạn không thể căn chỉnh dữ liệu, bạn có thể sử dụng '_mm_loadu_si128()' tại một hình phạt hiệu suất. – Mysticial

+1

Căn chỉnh dữ liệu? Bạn có ý gì thông qua chuyện đó? – pythonic

Trả lời

10

Tóm tắt nhận xét thành câu trả lời:

Bạn về cơ bản rơi vào cùng một cái bẫy bắt hầu hết các bộ hẹn giờ đầu tiên. Về cơ bản, có hai vấn đề trong ví dụ của bạn:

  1. Bạn đang lạm dụng _mm_set_epi32().
  2. Bạn có tỷ lệ tính toán/lưu trữ rất thấp. (1-3 trong ví dụ của bạn)

_mm_set_epi32() là rất tốn kém nội tại. Mặc dù nó thuận tiện để sử dụng, nhưng nó không biên dịch thành một lệnh đơn lẻ. Một số trình biên dịch (chẳng hạn như VS2010) có thể tạo mã hoạt động kém khi sử dụng _mm_set_epi32().

Thay vào đó, vì bạn đang tải các khối liên tiếp của bộ nhớ, bạn nên sử dụng _mm_load_si128(). Điều đó đòi hỏi con trỏ phải được liên kết với 16 byte. Nếu bạn không thể đảm bảo căn chỉnh này, bạn có thể sử dụng _mm_loadu_si128() - nhưng với hình phạt hiệu suất. Lý tưởng nhất, bạn nên căn chỉnh dữ liệu của mình đúng cách để không cần phải sử dụng _mm_loadu_si128().


Thực sự hiệu quả với SSE, bạn cũng sẽ muốn tối đa hóa tỷ lệ tính toán/tải cửa hàng của mình. Mục tiêu mà tôi chụp là 3 - 4 hướng dẫn số học cho mỗi lần truy cập bộ nhớ. Đây là một tỷ lệ khá cao. Thông thường bạn phải cấu trúc lại mã hoặc thiết kế lại thuật toán để tăng nó. Kết hợp truyền qua dữ liệu là một cách tiếp cận phổ biến.

Việc bỏ vòng lặp thường là cần thiết để tối đa hóa hiệu suất khi bạn có thân vòng lặp lớn với chuỗi phụ thuộc dài.


Một số ví dụ về câu hỏi SO sử dụng thành công SSE để đạt được tăng tốc.

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