Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int main() {
- int v_dim;
- MY_VECTOR *v_tab[2];
- printf("Podaj wymiar wektorow\n");
- scanf_s("%d", &v_dim);
- for (int i = 0; i < 2; i++) {
- v_tab[i] = input_vector(i, v_dim);
- }
- DWORD start = GetTickCount();
- double dot = dot_product_simple(v_tab);
- DWORD end = GetTickCount();
- assert((int)dot == v_dim);
- DWORD start2 = GetTickCount();
- double dot2 = dot_product_advanced(v_tab);
- DWORD end2 = GetTickCount();
- assert((int)dot2 == v_dim);
- printf("Iloczyn skalarny: %lf\n", dot);
- printf("Szybkosc zwyklego: %u, szybkosc z rozwinieciem: %u\n", end - start, end2 - start2);
- for (int i = 0; i < 2; i++) {
- free_vector(v_tab[i]);
- }
- system("pause");
- return 0;
- }
- ---------------------------------------------------------------------------------------------------
- MY_VECTOR * create_vector(int dim, double *buff, char *str) {
- MY_VECTOR *v = (MY_VECTOR*)malloc(sizeof(MY_VECTOR));
- strcpy_s(v->str, 64, str);
- v->dim = dim;
- v->buff = buff;
- return v;
- }
- MY_VECTOR * input_vector(int num, int dim) {
- char str[64];
- double *buff = (double*) malloc(sizeof(double)*dim);
- printf("Podaj nazwe wektora\n");
- scanf_s("%s", str, 64);
- for (int i = 0; i < dim; i++) {
- if (num == 0)
- buff[i] = 1 / (double)(i + 1);
- else
- buff[i] = i + 1;
- }
- return create_vector(dim, buff, str);
- }
- void free_vector(MY_VECTOR *v) {
- if (v) {
- if (v->buff)
- free(v->buff);
- free(v);
- }
- }
- double dot_product_simple(MY_VECTOR *v_tab[]) {
- assert(v_tab[0]->dim == v_tab[1]->dim);
- double sum = 0;
- for (int i = 0; i < v_tab[0]->dim; i++) {
- sum += v_tab[0]->buff[i] * v_tab[1]->buff[i];
- }
- return sum;
- }
- double dot_product_advanced(MY_VECTOR * v_tab[]) {
- assert(v_tab[0]->dim == v_tab[1]->dim);
- int dim = v_tab[0]->dim;
- double sum = 0.0f;
- int dim_rest = 0;
- if (dim % 8 != 0)
- dim_rest = dim % 8;
- int dim_repeats = (dim - dim_rest) / 8;
- for (int i = 0; i < dim_repeats; i++) {
- sum += v_tab[0]->buff[i ] * v_tab[1]->buff[i ];
- sum += v_tab[0]->buff[i + 1] * v_tab[1]->buff[i + 1];
- sum += v_tab[0]->buff[i + 2] * v_tab[1]->buff[i + 2];
- sum += v_tab[0]->buff[i + 3] * v_tab[1]->buff[i + 3];
- sum += v_tab[0]->buff[i + 4] * v_tab[1]->buff[i + 4];
- sum += v_tab[0]->buff[i + 5] * v_tab[1]->buff[i + 5];
- sum += v_tab[0]->buff[i + 6] * v_tab[1]->buff[i + 6];
- sum += v_tab[0]->buff[i + 7] * v_tab[1]->buff[i + 7];
- }
- for (int i = (dim - dim_rest); i < dim; i++) {
- sum += v_tab[0]->buff[i] * v_tab[1]->buff[i];
- }
- return sum;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement