Cuda не правильно считает
14.05.2013, 23:50. Показов 1437. Ответов 3
Здравствуйте, у меня тема курсовой работы "Исследование технологии 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
|