Форум программистов, компьютерный форум, киберфорум
CUDA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 4
1

Cuda не правильно считает

14.05.2013, 23:50. Показов 1437. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня тема курсовой работы "Исследование технологии Cuda, и я решил что буду исследовать на примере перемножения двух матриц, основную часть программы я нашёл, и сейчас проблема в том что код программы немного не так работает, именно в Cuda, подскажите как решить проблему не верных расчётов в Cuda???
P.S. расчёт первой строчки массива производиться правильно, а дальше беда какая то...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <stdio.h>
#include <cuda_runtime_api.h>
#include <ctime>
#include <windows.h>
#include <locale.h>
#include <stdlib.h> 
#include <vector> 
#define N (3)
 
__global__ void multgpu( int *a, int *b, int *c) { 
    int bx = blockIdx.x; 
    int by = blockIdx.y; 
    int tx = threadIdx.x; 
    int ty = threadIdx.y; 
    float sum = 0.0; 
    int ia = 128 * by + ty; 
    int ib = 128 * bx + tx; 
    for (int k=0; k < N; k++) 
        sum += a[ia * N + k] * b[ib + k * N]; 
    int ic = N * 128 * by + 128 * bx; 
    c[ic + N * ty + tx] = sum; 
}
 
__host__ void multcpu( int *a, int *b, int *c) { 
    float sum = 0.0;
    for (int i = 0; i < N; i++){ 
        for (int j = 0; j < N; j++){
            sum = 0;
            for (int k=0; k < N; k++)
                sum += a[i*N+k] * b[j+k*N];
            c[i*N+j]=sum;
        }
    }
}
 
int main ( void )
{
    setlocale(LC_ALL, "RUS");
    char *F;
    F=(char *)malloc(sizeof(char));
    printf("Хотите вывод данных?(Y/N)");
    scanf("%c", F);
    printf("\n");
    register long int cpu_t;
    register long int gpu_t;
    int *a,*b; 
    int *c,*d; 
    a=(int *)malloc(N*N*sizeof(int)); 
    b=(int *)malloc(N*N*sizeof(int)); 
    c=(int *)malloc(N*N*sizeof(int));
    d=(int *)malloc(N*N*sizeof(int)); 
    gpu_t=clock();
    int *dev_a, *dev_b; 
    int *dev_c;
    cudaMalloc((void**) &dev_a, N*N*sizeof(int)); 
    cudaMalloc((void**) &dev_b, N*N*sizeof(int)); 
    cudaMalloc((void**) &dev_c, N*N*sizeof(int));
    for (int i=0; i<N*N; i++) { 
        a[i]=i; 
        b[i]=i*3; 
    } 
    for (int i=0; i<N*N; i++){
        c[i]=0;
        d[i]=0;
    } 
    printf("Initialization is finished\n");
    cudaMemcpy(dev_a, a, N*N*sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, N*N*sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_c, c, N*N*sizeof(int), cudaMemcpyHostToDevice); 
    multgpu <<<max(1,N/128), 128>>> (dev_a,dev_b,dev_c); 
    cudaMemcpy(c, dev_c, N*N*sizeof(int), cudaMemcpyDeviceToHost); 
    gpu_t=clock()-gpu_t;
    cpu_t=clock();
    multcpu (a,b,d); 
    cpu_t=clock()-cpu_t;
    printf("Done");
    printf("\n");
    if (F[0]=='Y'){
        for (int i=0; i<N*N; i++) { 
            if (i%N==0) printf("\n"); 
        printf("%i ",a[i]); 
        } 
        printf("\n"); 
        for (int i=0; i<N*N; i++) { 
        if (i%N==0) printf("\n"); 
            printf("%i ",b[i]); 
        } 
        printf("\n"); 
        for (int i=0; i<N*N; i++) { 
            if (i%N==0) printf("\n"); 
            printf("%i ",c[i]); 
        } 
        printf("\n");
        for (int i=0; i<N*N; i++){
            if (i%N==0) printf("\n");
            printf("%i ",d[i]);
        }
    }
 
    cudaFree(dev_a); 
    cudaFree(dev_b); 
    cudaFree(dev_c); 
    free(a); 
    free(b); 
    free(c);
    free(d);
    free(F); 
    printf("\n");
    printf("cpu time=%ld \r\n", cpu_t);
    printf("\n");
    printf("gpu time=%ld \r\n", gpu_t);
    printf("\n");
    printf("done");
    system("PAUSE");
    return 0;
}
Добавлено через 1 час 48 минут
Можете закрывать тему я разобрался
вот рабочий код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <cuda_runtime_api.h>
#include <ctime>
#include <windows.h>
#include <locale.h>
#include <stdlib.h> 
#include <vector> 
#include <math.h>
#define SZ_BLOCK (16)
#define N (2048)
 
__global__ void multgpu( int *a, int *b, int *c) { 
    int bx = blockIdx.x;
    int by = blockIdx.y;
    int tx = threadIdx.x;
    int ty = threadIdx.y; 
    
    int sum = 0;
    int ia = N * SZ_BLOCK * by + N * ty; 
    int ib = SZ_BLOCK * bx + tx; 
 
    for (int k = 0; k < N; k++) 
        sum += a[ia + k] * b[ib + k * N]; 
    int ic = N * SZ_BLOCK * by + SZ_BLOCK * bx; 
    c[ic + N * ty + tx] = sum; 
}
 
__host__ void multcpu( int *a, int *b, int *c) { 
    int sum = 0;
    for (int i = 0; i < N; i++){ 
        for (int j = 0; j < N; j++){
            sum = 0;
            for (int k = 0; k < N; k++)
                sum += a[i * N + k] * b[j + k * N];
            c[i * N + j] = sum;
        }
    }
}
 
int main ( int argc, char *  argv [] )
{
    setlocale(LC_ALL, "RUS");
    char *F;
    F=(char *)malloc(sizeof(char));
    printf("Хотите вывод данных?(Y/N)");
    scanf("%c", F);
    printf("\n");
 
    register long int cpu_t;
    register long int gpu_t;
 
    int *a,*b; 
    int *c,*d; 
    int sizeMal = N * N * sizeof(int);
 
    a=(int *)malloc(sizeMal); 
    b=(int *)malloc(sizeMal); 
    c=(int *)malloc(sizeMal);
    d=(int *)malloc(sizeMal);
 
    for (int i=0; i<N*N; i++) { 
        a[i]=i; 
        b[i]=i*3; 
    } 
    for (int i=0; i<N*N; i++){
        c[i]=0;
        d[i]=0;
    }  
 
    gpu_t=clock();
 
    int *dev_a, *dev_b; 
    int *dev_c;
 
    cudaMalloc((void**) &dev_a, sizeMal); 
    cudaMalloc((void**) &dev_b, sizeMal); 
    cudaMalloc((void**) &dev_c, sizeMal);
 
    dim3 threads ( SZ_BLOCK, SZ_BLOCK );
    dim3 blocks ( N / threads.x, N / threads.y );
 
    printf("Выделение памяти для переменных завершено\n");
    cudaMemcpy(dev_a, a, sizeMal, cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, sizeMal, cudaMemcpyHostToDevice); 
    multgpu<<<blocks, threads>>> (dev_a,dev_b,dev_c); 
    cudaMemcpy(c, dev_c, sizeMal, cudaMemcpyDeviceToHost); 
    gpu_t=clock()-gpu_t;
    cpu_t=clock();
    multcpu (a,b,d); 
    cpu_t=clock()-cpu_t;
    if (F[0]=='Y'){
        for (int i=0; i<N*N; i++) { 
            if (i%N==0) printf("\n"); 
        printf("%i ",a[i]); 
        } 
        printf("\n"); 
        for (int i=0; i<N*N; i++) { 
        if (i%N==0) printf("\n"); 
            printf("%i ",b[i]); 
        } 
        printf("\n"); 
        for (int i=0; i<N*N; i++) { 
            if (i%N==0) printf("\n"); 
            printf("%i ",c[i]); 
        } 
        printf("\n");
        for (int i=0; i<N*N; i++){
            if (i%N==0) printf("\n");
            printf("%i ",d[i]);
        }
    }
 
    cudaFree(dev_a); 
    cudaFree(dev_b); 
    cudaFree(dev_c); 
    free(a); 
    free(b); 
    free(c);
    free(d);
    free(F); 
    printf("\n");
    printf("cpu time=%ld \r\n", cpu_t);
    printf("\n");
    printf("gpu time=%ld \r\n", gpu_t);
    printf("\n");
    printf("Готово");
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2013, 23:50
Ответы с готовыми решениями:

Не запускается приложение под Cuda (CUDA directory not found)
Здравствуйте, пытаюсь скомпилировать приложение под Cuda но вылазит ошибка, что CUDA directory not...

Не правильно считает
Добрый день! Уважаемые форумчане, помогите найти ошибку. Все верно написал, программа работает, но...

не правильно считает
h=Edit1-&gt;Text.ToInt(); r=Edit2-&gt;Text.ToInt(); v=(r*r)*(3.14)*h; Label4-&gt;Caption=&quot; v=...

Не правильно считает :-(
Всем доброго времени суток!!! Неправильный подсчет суммы в Sql, что не так делаю? Если писать...

3
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
14.05.2013, 23:59 2
dk61, чувак, я подписался на эту тему, скажу -- двойное спасибо.
0
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 4
15.05.2013, 16:56  [ТС] 3
Говорю же решил проблему, рабочий текст во втором сообщении)))
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
15.05.2013, 17:23 4
dk61, я и благодарю... Спасибо ещё раз.
0
15.05.2013, 17:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2013, 17:23
Помогаю со студенческими работами здесь

не правильно считает!
написал програму, которая считает етот вираз X=A*(B-C)+D/E+K но програма не правильно считает...

Не правильно считает
Не правильно считает не могу понять в чём проблема.... using System; using...

Считает не правильно
Всем привет! Начал практиковать программирование С++, что бы сдать зачет по вычислительной...

Не правильно считает
Найдите ошибку, почемуто не правильно выводит итог программа. #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru