Люди, помогите пожалуйста, я новичек в cuda - проблема в том, что не выполняется синхронизация и соответственно не видно результатов вычислений. Программка должна перемножать 2 матрицыю Вот код:
- #include <stdlib.h>
- #include <stdio.h>
- __global__ void matmult(float * m1, float * m2, float * r, int k, int n, int m)
- {
- int Xr = threadIdx.x % m;
- int Yr = threadIdx.x / m;
- int Y1 = Yr, X2 = Xr;
- r[threadIdx.x] = 0;
- for (int i=0; i<n; ++i)
- r[threadIdx.x] += (n*Y1 + i) * (m*i + X2);
- }
- #define k 3
- #define n 4
- #define m 2
- void printMat(float *mat, int width, int height);
- int main(int argc, char *args[])
- {
- float a[k*n], b[n*m], c[k*m];
- for (int i=0; i<k*n; ++i)
- a[i] = (double)rand() / (double)RAND_MAX * 10.0;
- for (int i=0; i<m*n; ++i)
- b[i] = (double)rand() / (double)RAND_MAX * 10.0;
- float *a_d, *b_d, *c_d;
- cudaMalloc((void**)&a_d, sizeof(float)*k*n);
- cudaMalloc((void**)&b_d, sizeof(float)*m*n);
- cudaMalloc((void**)&c_d, sizeof(float)*k*m);
- cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyDeviceToHost);
- cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyDeviceToHost);
- matmult<<<1, k*m>>>(a_d, b_d, c_d, k, n, m);
- cudaThreadSynchronize();
- cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyHostToDevice);
- printMat(a, n, k);
- printMat(b, m, n);
- printMat(c, m, k);
- cudaFree(a_d);
- cudaFree(b_d);
- cudaFree(c_d);
- return 0;
- }
- void printMat(float *mat, int width, int height)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width; ++j)
- }
- }
Матрица после выполнения вычислений забита нулями.
Или может вовсе не в синхронизации дело?
PS: за качество кода сильно не пинайте
Comments
Спасибо всем за помощь, разобрался вроде.
Умудрился посадить ошибку еще в одном месте - вместо перемножения ячеек матрицы помножил их индексы. Ужость
Ой! В самом деле. Спасибо,что подметил. Постоянные проблемы с внимательностью ((
cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyDeviceToHost);
cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyDeviceToHost);
поменяй на
cudaMemcpy(a_d, a, sizeof(float)*k*n, cudaMemcpyHostToDevice);
cudaMemcpy(b_d, b, sizeof(float)*m*n, cudaMemcpyHostToDevice);
а
cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyHostToDevice);
на
cudaMemcpy(c, c_d, sizeof(float)*k*m, cudaMemcpyDeviceToHost);
0.013 5.636 1.933 8.087
5.850 4.799 3.503 8.960
8.228 7.466 1.741 8.589
Я слышал, режим эмуляции отличается в некоторых моментах от реального и может показывать другие результаты.
И еще: киньте, плиз, какую-нибудь ссылочку на пример использования этой технологии (только не sdk)
вот тот пример был моей первой скомпиленной прогой
http://llpanorama.wordpress.com/2008/05/21/my-first-cuda-program/
а вообще сдк оч даже хор штука
там для каждого примера пдф мануал подробный
надо просто примеры выбирать попроще