Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
dk61
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 4
14.05.2013, 23:50     Cuda не правильно считает #1
Здравствуйте, у меня тема курсовой работы "Исследование технологии 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 23:50     Cuda не правильно считает
Посмотрите здесь:

C++ Не правильно считает(((
C++ не правильно считает
C++ Не правильно считает
C++ Почему не правильно считает ?
Не правильно считает C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
14.05.2013, 23:59     Cuda не правильно считает #2
dk61, чувак, я подписался на эту тему, скажу -- двойное спасибо.
dk61
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 4
15.05.2013, 16:56  [ТС]     Cuda не правильно считает #3
Говорю же решил проблему, рабочий текст во втором сообщении)))
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
15.05.2013, 17:23     Cuda не правильно считает #4
dk61, я и благодарю... Спасибо ещё раз.
Yandex
Объявления
15.05.2013, 17:23     Cuda не правильно считает
Ответ Создать тему
Опции темы

Текущее время: 06:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru