int main(int argc, char *argv[])
{
	int i;
	u8 *buff1, *buff2, gf_const_tbl[64], a = 2;
	struct perf start, stop;

	printf("gf_vect_mul_avx_perf:\n");

	gf_vect_mul_init(a, gf_const_tbl);

	// Allocate large mem region
	buff1 = (u8 *) malloc(TEST_LEN);
	buff2 = (u8 *) malloc(TEST_LEN);
	if (NULL == buff1 || NULL == buff2) {
		printf("Failed to allocate %dB\n", TEST_LEN);
		return 1;
	}

	memset(buff1, 0, TEST_LEN);
	memset(buff2, 0, TEST_LEN);

	gf_vect_mul_avx(TEST_LEN, gf_const_tbl, buff1, buff2);

	printf("Start timed tests\n");
	fflush(0);

	gf_vect_mul_avx(TEST_LEN, gf_const_tbl, buff1, buff2);
	perf_start(&start);
	for (i = 0; i < TEST_LOOPS; i++) {
		gf_vect_mul_init(a, gf_const_tbl);
		gf_vect_mul_avx(TEST_LEN, gf_const_tbl, buff1, buff2);
	}
	perf_stop(&stop);
	printf("gf_vect_mul_avx" TEST_TYPE_STR ": ");
	perf_print(stop, start, (long long)TEST_LEN * i);

	return 0;
}
예제 #2
0
int main(int argc, char *argv[])
{
	int i;
	u8 *buff1, *buff2, *buff3, gf_const_tbl[64], a = 2;
	int align, size;
	unsigned char *efence_buff1;
	unsigned char *efence_buff2;
	unsigned char *efence_buff3;

	printf("gf_vect_mul_avx:\n");
	mk_gf_field();
	gf_vect_mul_init(a, gf_const_tbl);


	buff1 = (u8*) malloc(TEST_SIZE);
	buff2 = (u8*) malloc(TEST_SIZE);
	buff3 = (u8*) malloc(TEST_SIZE);

	if (NULL == buff1 || NULL == buff2 || NULL == buff3){
		printf("buffer alloc error\n");
		return -1;
	}

	// Fill with rand data
	for(i=0; i<TEST_SIZE; i++)
		buff1[i] = rand();


	gf_vect_mul_avx(TEST_SIZE, gf_const_tbl, buff1, buff2);
	
	for (i=0; i<TEST_SIZE; i++)
		if (gf_mul(a, buff1[i]) != buff2[i]) {
			printf("fail at %d, 0x%x x 2 = 0x%x (0x%x)\n",i, buff1[i], buff2[i], gf_mul(2, buff1[i]));
			return 1;
		}


	gf_vect_mul_base(TEST_SIZE, gf_const_tbl, buff1, buff3);

	// Check reference function
	for (i=0; i<TEST_SIZE; i++)
		if (buff2[i] != buff3[i]) {
			printf("fail at %d, 0x%x x 0x%d = 0x%x (0x%x)\n",
				i, a, buff1[i], buff2[i], gf_mul(a, buff1[i]));
			return 1;
		}




	for(i=0; i<TEST_SIZE; i++)
		buff1[i] = rand();

	// Check each possible constant
	printf("Random tests ");
	for(a=0; a!=255; a++){
		gf_vect_mul_init(a, gf_const_tbl);
		gf_vect_mul_avx(TEST_SIZE, gf_const_tbl, buff1, buff2);

		for (i=0; i<TEST_SIZE; i++)
			if (gf_mul(a, buff1[i]) != buff2[i]) {
				printf("fail at %d, 0x%x x %d = 0x%x (0x%x)\n",
					i, a, buff1[i], buff2[i], gf_mul(2, buff1[i]));
				return 1;
			}
		putchar('.');
	}

	// Run tests at end of buffer for Electric Fence
	align = 32;
	a = 2;
	mk_gf_field();
	gf_vect_mul_init(a, gf_const_tbl);
	for(size=0; size<TEST_SIZE; size+=align){
		// Line up TEST_SIZE from end
		efence_buff1 = buff1 + size;
		efence_buff2 = buff2 + size;
		efence_buff3 = buff3 + size;

		gf_vect_mul_avx(TEST_SIZE-size, gf_const_tbl, efence_buff1, efence_buff2);

		for (i=0; i<TEST_SIZE-size; i++)
			if (gf_mul(a, efence_buff1[i]) != efence_buff2[i]) {
				printf("fail at %d, 0x%x x 2 = 0x%x (0x%x)\n",
					i, efence_buff1[i], efence_buff2[i], gf_mul(2, efence_buff1[i]));
				return 1;
			}

		gf_vect_mul_base(TEST_SIZE-size, gf_const_tbl, efence_buff1, efence_buff3);

		// Check reference function
		for (i=0; i<TEST_SIZE-size; i++)
			if (efence_buff2[i] != efence_buff3[i]) {
				printf("fail at %d, 0x%x x 0x%d = 0x%x (0x%x)\n",
					i, a, efence_buff2[i], efence_buff3[i], gf_mul(2, efence_buff1[i]));
				return 1;
			}

		putchar('.');
	}

	printf(" done: Pass\n");
	return 0;
}