Информация о задержке и пропускной способности _mm256_setr_epi32() в руководство по встроенным функциям Intel.
Кто-нибудь знает это или знает способ его расчета?
Большое спасибо!
Информация о задержке и пропускной способности _mm256_setr_epi32() в руководство по встроенным функциям Intel.
Кто-нибудь знает это или знает способ его расчета?
Большое спасибо!
Это не указано самой корпорацией Intel, здесь инструкция-набор-ссылка-руководство-325383.pdf" rel="nofollow noreferrer">https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32 -architectures-software-developer-instruction-set-reference-manual-325383.pdf таблица C.2 Раздел COMPOSITE INTRINSIC намекает, что будет набор инструкций, зависящий от ввода компилятора.
в приведенном ниже случае, когда ввод непредсказуем компилятором, он компилируется с оптимизацией по следующим инструкциям:
volatile int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
00007FF71DE91013 mov dword ptr [rbp+1Ch],1
00007FF71DE9101A mov dword ptr [rbp+18h],2
00007FF71DE91021 mov dword ptr [rbp+14h],3
00007FF71DE91028 mov dword ptr [rbp+10h],4
00007FF71DE9102F mov dword ptr [rbp+0Ch],5
00007FF71DE91036 mov dword ptr [rbp+8],6
00007FF71DE9103D mov dword ptr [rbp+4],7
00007FF71DE91044 mov dword ptr [rbp],8
volatile __m256i reg = _mm256_setr_epi32(a,b,c,d,e,f,g,h);
00007FF71DE9104B mov ebx,dword ptr [rbp]
00007FF71DE9104E mov r11d,dword ptr [g]
00007FF71DE91052 mov r10d,dword ptr [f]
00007FF71DE91056 mov r9d,dword ptr [e]
00007FF71DE9105A mov r8d,dword ptr [d]
00007FF71DE9105E mov edx,dword ptr [c]
00007FF71DE91061 mov ecx,dword ptr [b]
00007FF71DE91064 mov eax,dword ptr [a]
00007FF71DE91067 vmovd xmm1,eax
00007FF71DE9106B vpinsrd xmm1,xmm1,ecx,1
00007FF71DE91071 vpinsrd xmm1,xmm1,edx,2
00007FF71DE91077 vmovd xmm0,r9d
00007FF71DE9107C vpinsrd xmm0,xmm0,r10d,1
00007FF71DE91082 vpinsrd xmm0,xmm0,r11d,2
00007FF71DE91088 vpinsrd xmm1,xmm1,r8d,3
00007FF71DE9108E vpinsrd xmm0,xmm0,ebx,3
00007FF71DE91094 vinsertf128 ymm0,ymm1,xmm0,1
00007FF71DE9109A vmovdqu ymmword ptr [rbp+20h],ymm0
Но если ввод известен компилятору, он выглядит намного короче...
volatile __m256i reg = _mm256_setr_epi32(1,2,3,4,5,6,7,8);
00007FF7789C100F vmovdqu ymm0,ymmword ptr [__ymm@0000000800000007000000060000000500000004000000030000000200000001 (07FF7789C2200h)]
00007FF7789C1017 vmovdqu ymmword ptr [rbp],ymm0
Так что латентность и циклы даже приблизительно не известны. В любом случае, я считаю, что правильный раздел для поиска в справочнике по ассемблеру - это описание VINSERTI128 (в настоящее время страница 1670, если перейти по моей ссылке выше)
set_epi*
могут компилироваться по-разному в зависимости от контекста, поэтому вам следует применять статический анализ к выходным данным компилятора, а не к входным данным компилятора. например Что такое IACA и как его использовать? иногда полезно.
- person Peter Cordes; 05.07.2018