一 C语言实现
int a[128] = {0};
int b[128] = {0};
int sum = 0;
for (int i = 0; i < 128; i++)
{
sum += a[i] * b[i];
}
二 simd汇编实现
global dpb_8x8_uint8
dpb_8x8_uint8:
vpmovsxbd ymm0, [rdi];
vpmovsxbd ymm1, [rsi];
vpmulld ymm1, ymm1, ymm0
vmovdqu ymm2, [rdx]
vpaddd ymm2, ymm2, ymm1
vmovdqu [rdx], ymm2;
ret
c语言调用代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
extern void dpb_8x8_uint8(uint8_t *a, uint8_t *b, uint8_t *c);
int main()
{
uint8_t a[16] = {0};
memset(a, 0x02, 16);
uint8_t b[16] = {0};
memset(b, 0x03, 16);
uint32_t res[8] = {0};
memset(res, 0x0, 32);
dpb_8x8_uint8(a, b, res);
for (int i = 0; i < 8; i++)
printf("%d ", res[i]);
printf("\n");
dpb_8x8_uint8(a + 8, b + 8, res);
printf("add again\n");
for (int i = 0; i < 8; i++)
printf("%d ", res[i]);
printf("\n");
return 0;
}
test# ./dpb_test
6 6 6 6 6 6 6 6
add again
12 12 12 12 12 12 12 12