Tôi có chức năng nút cổ chai sau.Làm cách nào để tối ưu hóa chu kỳ?
typedef unsigned char byte;
void CompareArrays(const byte * p1Start, const byte * p1End, const byte * p2, byte * p3)
{
const byte b1 = 128-30;
const byte b2 = 128+30;
for (const byte * p1 = p1Start; p1 != p1End; ++p1, ++p2, ++p3) {
*p3 = (*p1 < *p2) ? b1 : b2;
}
}
Tôi muốn thay thế C++
mã bằng SSE2 chức năng nội tại. Tôi đã thử _mm_cmpgt_epi8
nhưng nó đã sử dụng so sánh đã ký. Tôi cần so sánh không dấu.
Có thủ thuật nào (SSE, SSE2, SSSE3) để giải quyết sự cố của tôi không?
Lưu ý: Tôi không muốn sử dụng đa luồng trong trường hợp này.
Bạn có biết kiến trúc vi xử lý nào bạn đang nhắm mục tiêu không? Làm việc với một đoạn từ 64 bit tại một thời điểm (bit twiddling để thực hiện các so sánh trong đăng ký) có thể làm giảm ganh đua bus bộ nhớ một chút. Mã lắp ráp của trình biên dịch sẽ giúp cung cấp ý tưởng ... ... và không phải là SSE dành cho dấu phẩy động, không phải là số nguyên? –
SSE có một số hướng dẫn số nguyên. – Crashworks
Tại sao không làm cho họ ký? một XOR 0x80 đơn giản với mỗi phần tử trước khi so sánh sẽ thực hiện công việc. – ruslik