书写段矩阵加法的cuda程序,C++程序,矩阵随机产生
时间: 2024-03-04 17:49:36 浏览: 77
cuda编程要点
4星 · 用户满意度95%
好的,以下是一份使用CUDA进行矩阵加法的C++程序,其中包括了矩阵随机产生的代码:
```c++
#include <iostream>
#include <cuda_runtime.h>
#define MATRIX_SIZE 1024
#define BLOCK_SIZE 16
__global__ void matrixAdd(float *a, float *b, float *c, int size)
{
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < size && col < size)
{
int index = row * size + col;
c[index] = a[index] + b[index];
}
}
void printMatrix(float *a, int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
std::cout << a[i * size + j] << " ";
}
std::cout << std::endl;
}
}
int main()
{
float *a, *b, *c;
float *dev_a, *dev_b, *dev_c;
int size = MATRIX_SIZE * MATRIX_SIZE * sizeof(float);
// Allocate memory on host
a = (float*)malloc(size);
b = (float*)malloc(size);
c = (float*)malloc(size);
// Initialize matrices with random values
for (int i = 0; i < MATRIX_SIZE * MATRIX_SIZE; i++)
{
a[i] = (float)rand() / RAND_MAX;
b[i] = (float)rand() / RAND_MAX;
}
// Allocate memory on device
cudaMalloc((void**)&dev_a, size);
cudaMalloc((void**)&dev_b, size);
cudaMalloc((void**)&dev_c, size);
// Copy matrices from host to device
cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);
// Define grid and block sizes
dim3 dimGrid((MATRIX_SIZE - 1) / BLOCK_SIZE + 1, (MATRIX_SIZE - 1) / BLOCK_SIZE + 1, 1);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE, 1);
// Call kernel function
matrixAdd<<<dimGrid, dimBlock>>>(dev_a, dev_b, dev_c, MATRIX_SIZE);
// Copy matrix from device to host
cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);
// Print matrix
printMatrix(c, MATRIX_SIZE);
// Free memory
free(a);
free(b);
free(c);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
}
```
在上面的程序中,我们使用了`matrixAdd`函数来执行矩阵加法。该函数是一个CUDA kernel函数,它将在GPU上执行。该函数将两个矩阵`a`和`b`相加,并将结果存储在矩阵`c`中。`size`参数表示矩阵的大小。
在主函数中,我们首先分配了三个矩阵`a`,`b`和`c`的内存。然后,我们使用`rand()`函数生成随机数来初始化矩阵`a`和`b`。接下来,我们将矩阵从主机内存复制到设备内存,并在`matrixAdd`函数上调用CUDA kernel。最后,我们将结果矩阵`c`从设备内存复制到主机内存,并将其打印出来。
需要注意的是,在CUDA中,我们需要定义网格(grid)和块(block)的大小来调用kernel函数。在上面的程序中,我们使用一个`dim3`结构体来定义网格和块的大小。在这里,我们将网格的大小设置为`(MATRIX_SIZE - 1) / BLOCK_SIZE + 1`,块的大小设置为`BLOCK_SIZE`。
希望这可以帮助到您!
阅读全文