Умножение матрицы на матрицу с помощью Cuda

 
0
 
C++
ava
Toyamatokanava | 20.02.2013, 15:02
Есть код для умножение простой матрицы 2на2 на матрицу 2на2. Программа нормально вычисляет первую строку получившейся матрицы, а вторую криво. Может есть знающие люди, которые могут подсказать ошибку?


#include <stdio.h> 
#include <stdlib.h> 
#include <vector>
#include <conio.h>
#define N (2)
// вычисление умножения матрицы на матрицу

__global__ void mult( 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=N * 128 * by + N * ty; 
    int ib=128 * bx + tx; 
    for (int k=0; k < N; k++) 
        sum += a[ia + k] * b[ib + k * N]; 
    int ic = N * 128 * by + 128 * bx; 
    c[ic + N * ty + tx] = sum; 
}
int main( void ) {
    int *a,*b; 
    int *c; 
    a=(int *)malloc(N*N*sizeof(int)); 
    b=(int *)malloc(N*N*sizeof(int)); 
    c=(int *)malloc(N*N*sizeof(int)); 
    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*2; 
    }
    for (int i=0; i<N*N; i++) c[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); 
mult<<<max(1,N/128),128>>>(dev_a,dev_b,dev_c); 
    printf("Done"); 
    cudaMemcpy(c, dev_c,N*N*sizeof(int),cudaMemcpyDeviceToHost); 
    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]); 
    }
    _getch();
    cudaFree( dev_a); 
    cudaFree( dev_b); 
    cudaFree( dev_c); 
    free(a); 
    free(b); 
    free(c); 
    return 0; 
}
Ответы (0)

Комментарии не добавлены

Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить