GPU编程c++举例
时间: 2023-08-03 12:16:00 浏览: 90
c++编程实例
以下是一个简单的使用CUDA C++编写的矩阵乘法示例:
```c++
#include <iostream>
#include <cuda_runtime.h>
__global__ void matrixMul(float *A, float *B, float *C, int N)
{
int i = blockDim.y * blockIdx.y + threadIdx.y;
int j = blockDim.x * blockIdx.x + threadIdx.x;
float sum = 0.0f;
if (i < N && j < N) {
for (int k = 0; k < N; k++) {
sum += A[i * N + k] * B[k * N + j];
}
C[i * N + j] = sum;
}
}
int main()
{
const int N = 1024;
float *h_A, *h_B, *h_C;
float *d_A, *d_B, *d_C;
size_t size = N * N * sizeof(float);
h_A = (float*)malloc(size);
h_B = (float*)malloc(size);
h_C = (float*)malloc(size);
cudaMalloc(&d_A, size);
cudaMalloc(&d_B, size);
cudaMalloc(&d_C, size);
for (int i = 0; i < N * N; i++) {
h_A[i] = i % N;
h_B[i] = i % N;
}
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
dim3 block(16, 16);
dim3 grid((N + block.x - 1) / block.x, (N + block.y - 1) / block.y);
matrixMul<<<grid, block>>>(d_A, d_B, d_C, N);
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
std::cout << h_C[i * N + j] << " ";
}
std::cout << std::endl;
}
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
return 0;
}
```
该示例中,我们使用CUDA C++编写了一个矩阵乘法的核函数`matrixMul`,并在主函数中分配和传输数据,调用核函数进行计算,最后将结果传回主机并输出。在核函数中,我们使用了CUDA提供的特殊语法`__global__`来声明该函数是在设备上执行的,并使用了CUDA提供的特殊变量`blockIdx`、`threadIdx`和`blockDim`来获取线程在网格中的位置和网格大小,以及线程在块中的位置。使用这些语法和变量,我们可以轻松地编写高效的GPU程序。
阅读全文