问题描述
我写了一个CUDA C程序来并行化矩阵乘法。我已将矩阵存储为行主要形式的一维数组。我似乎找不到任何地方为什么我的程序不起作用,无论是指针还是内核代码问题。帮助将不胜感激,谢谢! (我知道我已经问过这个问题-但是,这次我在并行化方面又走了一步,并且编写了代码,以便每个线程计算结果矩阵的单个元素,而不是单个行-而且,检查当前当前在我的操作系统上加载了负责CUDA设备内存的nvidia_uvm模块-但这不是问题,问题必须出在我的源代码上
代码:
#include <stdio.h>
#include <cuda.h>
#include <time.h>
#include <stdlib.h>
__global__ void multiplyMatricesKernel(float* d_x,float* d_y,float* d_z,int m,int n,int p)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
int j = blockDim.y * blockIdx.x + threadIdx.y;
if(i < p && j < m)
{
for(int k = 0; k < n; ++k)
{
d_z[j * p + i] += d_x[j * n + k] * d_y[k * p + i];
}
}
}
void multiplyMatrices(float* x,float* y,float* z,int p)
{
dim3 dimOfGrid(ceil(m * p) / 64.0);
dim3 dimOfBlock(64,64);
size_t elements_x = m * n * sizeof(float);
size_t elements_y = n * p * sizeof(float);
size_t elements_z = m * p * sizeof(float);
float* d_x;
float* d_y;
float* d_z;
cudamalloc((void**) &d_x,elements_x);
cudamalloc((void**) &d_y,elements_y);
cudamalloc((void**) &d_z,elements_z);
cudamemcpy(d_x,x,elements_x,cudamemcpyHostToDevice);
cudamemcpy(d_y,y,elements_y,cudamemcpyHostToDevice);
multiplyMatricesKernel<<<dimOfGrid,dimOfBlock>>>(d_x,d_y,d_z,m,n,p);
cudamemcpy(z,elements_z,cudamemcpyDevicetoHost);
cudaFree(d_x);
cudaFree(d_y);
cudaFree(d_z);
}
int main()
{
srand(time(NULL));
size_t m = rand() % 8 + 1;
size_t n = rand() % 8 + 1;
size_t p = rand() % 8 + 1;
float x[m * n] = {0};
float y[n * p] = {0};
float z[m * p] = {0};
printf("X =\n[");
for(int i = 0; i < sizeof(x) / sizeof(float); ++i)
{
x[i] = rand() % 129 - 64;
printf("%.1f ",x[i]);
if((i + 1) % n == 0 && i != (sizeof(x) / sizeof(float) - 1))
{
printf("]\n[");
}
if(i == (sizeof(x) / sizeof(float) - 1))
{
printf("]\n\n");
}
}
printf("Y = \n[");
for(int i = 0; i < sizeof(y) / sizeof(float); ++i)
{
y[i] = rand() % 129 - 64;
printf("%.1f ",y[i]);
if((i + 1) % p == 0 && i != (sizeof(y) / sizeof(float) - 1))
{
printf("]\n[");
}
if(i == (sizeof(y) / sizeof(float) - 1))
{
printf("]\n\n");
}
}
multiplyMatrices(x,z,p);
printf("Z = \n[");
for(int i = 0; i < sizeof(z) / sizeof(float); ++i)
{
printf("%.1f ",z[i]);
if((i + 1) % p == 0 && i != (sizeof(z) / sizeof(float) - 1))
{
printf("]\n[");
}
if(i == (sizeof(z) / sizeof(float) - 1))
{
printf("]\n\n");
}
}
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)