使用CUDA在矩阵中添加相邻元素
给定一个nxn矩阵,我想找到相邻元素(上、下、左、右)的总和,并使用CUDA将中间元素替换为该总和,即,所有操作都应该并行完成 例如,使用3个元素 1 2 3 4 5 6 7 8 9 如果我们取中间元素(坐标(1,1)),相邻元素之和为(2+4+6+8=)20。这应该用中间元素替换 1 2 3 4206 7 8 9 这是我写的代码。如果n=3,此代码将起作用,如果n更大(例如:n=5),此代码将不起作用。请给我一个方法来概括这段代码 请帮帮我使用CUDA在矩阵中添加相邻元素,cuda,Cuda,给定一个nxn矩阵,我想找到相邻元素(上、下、左、右)的总和,并使用CUDA将中间元素替换为该总和,即,所有操作都应该并行完成 例如,使用3个元素 1 2 3 4 5 6 7 8 9 如果我们取中间元素(坐标(1,1)),相邻元素之和为(2+4+6+8=)20。这应该用中间元素替换 1 2 3 4206 7 8 9 这是我写的代码。如果n=3,此代码将起作用,如果n更大(例如:n=5),此代码将不起作用。请给我一个方法来概括这段代码 请帮帮我 #include <stdio.h> #
#include <stdio.h>
#include <stdlib.h>
#define N 3
#define BLOCK_DIM 3
__global__ void matrixAdd (int *a, int *c) {
int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;
int index = col + row * N;
int sum = 0;
if (row == 1 && col == 1 && col < N && row < N) {
sum = sum + a[index - 1];
sum = sum + a[index + 1];
sum = sum + a[index - 3];
sum = sum + a[index + 3];
}
c[index] = sum;
}
void printMatrix(int a[N][N] )
{
for(int i=0; i<N; i++){
for (int j=0; j<N; j++){
printf("%d\t", a[i][j] );
}
printf("\n");
}
}
int main() {
int a[N][N], c[N][N];
int *dev_a, *dev_c;
int size = N * N * sizeof(int);
for(int i=0; i<N; i++)
for (int j=0; j<N; j++){
a[i][j] = rand() % 256;
}
printf("Matrix A\n");
printMatrix(a);
cudaMalloc((void**)&dev_a, size);
cudaMalloc((void**)&dev_c, size);
cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
dim3 dimBlock(BLOCK_DIM, BLOCK_DIM);
dim3 dimGrid((N+dimBlock.x-1)/dimBlock.x, (N+dimBlock.y-1)/dimBlock.y);
printf("dimGrid.x = %d, dimGrid.y = %d\n", dimGrid.x, dimGrid.y);
matrixAdd<<<dimGrid,dimBlock>>>(dev_a,dev_c);
cudaDeviceSynchronize();
cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);
printf("Matrix c\n");
printMatrix(c);
cudaFree(dev_a);
cudaFree(dev_c);
}
#包括
#包括
#定义n3
#定义块_DIM 3
__全局无效矩阵ADD(int*a,int*c){
int col=blockIdx.x*blockDim.x+threadIdx.x;
int row=blockIdx.y*blockDim.y+threadIdx.y;
int index=列+行*N;
整数和=0;
如果(行==1&&col==1&&col 对于(int i=0;i如果您希望每个输出元素都是其输入的上、下、左、右邻域的总和,则只需在代码中做一点小更改即可处理任意大小的元素,如下所示:
if (row == 1 && col == 1 && col < N && row < N) {
sum = sum + a[index - 1];
sum = sum + a[index + 1];
sum = sum + a[index - 3];
sum = sum + a[index + 3];
}
c[index] = sum;
if (row > 0 && col > 0 && col < N-1 && row < N-1 ) { //note the change
sum = sum + a[index - 1];
sum = sum + a[index + 1];
sum = sum + a[index - N]; //note the change
sum = sum + a[index + N]; //note the change
c[index] = sum; //note the change
}
cudaMemcpy(dev_c, a, size, cudaMemcpyHostToDevice);