2015-09-17 27 views
5

Vì vậy, AVX có chức năng từ immintrin.h, cho phép lưu trữ kết nối hai giá trị __m128i thành một giá trị __m256i. Chức năng làĐặt __m256i thành giá trị của hai giá trị __m128i

__m256i _mm256_set_m128i (__m128i hi, __m128i lo) 

Tuy nhiên, khi tôi sử dụng nó, như vậy:

__m256i as[2]; __m128i s[4]; as[0] = _mm256_setr_m128i(s[0], s[1]); 

tôi nhận được một lỗi biên dịch:

error: incompatible types when assigning to type ‘__m256i’ from type ‘int’ 

Tôi thực sự không hiểu tại sao điều này xảy ra. Bất kỳ trợ giúp nào cũng được đánh giá rất cao!

+3

Bạn có chắc chắn rằng chức năng nằm trong tiêu đề đó không? Khi tôi cố gắng sử dụng hàm như bạn có sau '#include ', tôi nhận được thông báo cảnh báo" khai báo ngầm định '_mm256_set_m128i'". Trong C, một khai báo ngầm nghĩa là trình biên dịch giả sử hàm sẽ trả về một 'int', điều này cũng sẽ giải thích lỗi trình biên dịch. –

Trả lời

9

Không phải tất cả trình biên dịch dường như có _mm256_setr_m128i hoặc thậm chí _mm256_set_m128i, được xác định trong immintrin.h. Vì vậy, tôi thường chỉ xác định macro khi cần thiết, trong ngoặc vuông với #ifdef s phù hợp mà kiểm tra cho trình biên dịch và phiên bản:

#define _mm256_set_m128i(v0, v1) _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1) 

#define _mm256_setr_m128i(v0, v1) _mm256_set_m128i((v1), (v0)) 
  • Intel ICC 11.1 và sau đó có cả _mm256_set_m128i_mm256_setr_m128i.

  • MSVC 2012 trở lên chỉ có _mm256_set_m128i.

  • gcc/clang dường như không có, mặc dù tôi chưa kiểm tra các phiên bản gần đây để xem liệu điều này đã được khắc phục chưa.

+0

GCC dường như không có '_mm256_set_m128i' trong tiêu đề đó ... [Link] (http://ideone.com/f3gVol) –

+0

Điều này ... Tôi thực sự quan tâm đến hiệu suất ở đây, vì vậy tôi muốn sử dụng đúng hướng dẫn, không chỉ có được một cái gì đó có chức năng giống như –

+0

@MartinLauridsen: '_mm256_insertf128_si256' bản đồ cho một hướng dẫn duy nhất, vì vậy tôi không nghĩ rằng bạn có thể cải thiện về điều này. –

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