Files
csapp2025/perflab/matrix/rowcol.y~
2025-04-12 11:37:07 +08:00

241 lines
6.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**************************************************************************
靠/靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠<E99DA0>
1. 靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠<E99DA0>
2. 靠靠靠靠靠靠靠靠靠靠靠
3. 靠rc_fun_rec rc_fun_tab靠靠靠靠靠靠旷靠靠
靠靠旷靠靠靠靠靠靠靠蹩靠靠靠靠靠靠靠靠靠靠<E99DA0>
***************************************************************************/
/*
靠靠201209054233
靠靠靠靠靠靠靠
*/
#include <stdio.h>
#include <stdlib.h>
#include "rowcol.h"
#include <math.h>
/* 靠靠靠靠靠靠靠靠<E99DA0> */
/* 靠靠靠靠靠<E99DA0><E99DA0>靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠蚩靠靠
靠靠靠靠靠2靠靠靠靠靠旷靠靠<E99DA0>
*/
void c_sum(matrix_t M, vector_t rowsum, vector_t colsum)
{
int i,j;
for (j = 0; j < N; j++) {
colsum[j] = 0;
for (i = 0; i < N; i++)
colsum[j] += M[i][j];
}
}
/* 靠靠靠靠靠靠靠靠靠靠 */
/* 靠靠靠靠靠<E99DA0><E99DA0>靠靠<E99DA0>靠靠靠 */
void rc_sum(matrix_t M, vector_t rowsum, vector_t colsum)
{
int i,j;
for (i = 0; i < N; i++) {
rowsum[i] = colsum[i] = 0;
for (j = 0; j < N; j++) {
rowsum[i] += M[i][j];
colsum[i] += M[j][i];
}
}
}
/*
靠靠靠靠靠靠靠靠靠靠靠靠<E99DA0>靠靠靠靠靠靠靠<E99DA0>, COL/ROWCOL, "靠靠靠靠<E99DA0>"靠
COL靠靠<E99DA0>靠靠靠靠靠<E99DA0>靠靠<E99DA0>
ROWCOL靠靠<E99DA0>靠靠靠<E99DA0>靠靠<E99DA0>靠靠<E99DA0>
靠靠靠靠靠蹩靠靠靠靠靠靠靠靠<E99DA0>
靠靠
{my_c_sum1, "靠靠靠靠靠靠靠靠<E99DA0>"},
{my_rc_sum2, "靠靠靠靠靠靠靠靠靠"},
*/
rc_fun_rec rc_fun_tab[] =
{
/* 靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠 */
{c_sum, COL, "Best column sum"},
/* 靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠 */
{rc_sum, ROWCOL, "Best row and column sum"},
{c_sum, COL, "Column sum, reference implementation"},
{rc_sum, ROWCOL, "Row and column sum, reference implementation"},
/* 靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠靠<E99DA0> */
{NULL,ROWCOL,NULL}
};
// /**************************************************************************
// 行/列求和函数。按下面的要求编辑此文件:
// 1. 将你的学号、姓名,以注释的方式写到下面;
// 2. 实现不同版本的行列求和函数;
// 3. 编辑rc_fun_rec rc_fun_tab数组将你的最好的答案
// (最好的行和列求和、最好的列求和)作为数组的前两项
// ***************************************************************************/
//
// /*
// 学号202302723005
// 姓名:程景愉
// */
//
//
// #include <stdio.h>
// #include <stdlib.h>
// #include "rowcol.h"
// #include <math.h>
// #include <cuda_runtime.h>
//
// /* 参考的列求和函数实现 */
// /* 计算矩阵中的每一列的和。请注意对于行和列求和来说,调用参数是
// 一样的只是第2个参数不会用到而已
// */
//
// void c_sum(matrix_t M, vector_t rowsum, vector_t colsum)
// {
// int i,j;
// for (j = 0; j < N; j++) {
// colsum[j] = 0;
// for (i = 0; i < N; i++)
// colsum[j] += M[i][j];
// }
// }
//
//
// /* 参考的列和行求和函数实现 */
// /* 计算矩阵中的每一行、每一列的和。 */
//
// void rc_sum(matrix_t M, vector_t rowsum, vector_t colsum)
// {
// int i,j;
// for (i = 0; i < N; i++) {
// rowsum[i] = colsum[i] = 0;
// for (j = 0; j < N; j++) {
// rowsum[i] += M[i][j];
// colsum[i] += M[j][i];
// }
// }
// }
//
// /* CUDA优化的列求和函数 */
// void cuda_c_sum(matrix_t M, vector_t rowsum, vector_t colsum)
// {
// // 分配设备内存
// int *d_M, *d_colsum;
// cudaMalloc(&d_M, N * N * sizeof(int));
// cudaMalloc(&d_colsum, N * sizeof(int));
//
// // 将数据从主机复制到设备
// cudaMemcpy(d_M, M, N * N * sizeof(int), cudaMemcpyHostToDevice);
//
// // 定义CUDA核函数
// dim3 blockDim(256);
// dim3 gridDim((N + blockDim.x - 1) / blockDim.x);
//
// // 启动核函数
// cudaColumnSum<<<gridDim, blockDim>>>(d_M, d_colsum);
//
// // 将结果从设备复制回主机
// cudaMemcpy(colsum, d_colsum, N * sizeof(int), cudaMemcpyDeviceToHost);
//
// // 释放设备内存
// cudaFree(d_M);
// cudaFree(d_colsum);
// }
//
// /* CUDA优化的行列求和函数 */
// void cuda_rc_sum(matrix_t M, vector_t rowsum, vector_t colsum)
// {
// // 分配设备内存
// int *d_M, *d_rowsum, *d_colsum;
// cudaMalloc(&d_M, N * N * sizeof(int));
// cudaMalloc(&d_rowsum, N * sizeof(int));
// cudaMalloc(&d_colsum, N * sizeof(int));
//
// // 将数据从主机复制到设备
// cudaMemcpy(d_M, M, N * N * sizeof(int), cudaMemcpyHostToDevice);
//
// // 定义CUDA核函数
// dim3 blockDim(256);
// dim3 gridDim((N + blockDim.x - 1) / blockDim.x);
//
// // 启动核函数
// cudaRowColSum<<<gridDim, blockDim>>>(d_M, d_rowsum, d_colsum);
//
// // 将结果从设备复制回主机
// cudaMemcpy(rowsum, d_rowsum, N * sizeof(int), cudaMemcpyDeviceToHost);
// cudaMemcpy(colsum, d_colsum, N * sizeof(int), cudaMemcpyDeviceToHost);
//
// // 释放设备内存
// cudaFree(d_M);
// cudaFree(d_rowsum);
// cudaFree(d_colsum);
// }
//
// /* CUDA核函数 - 列求和 */
// __global__ void cudaColumnSum(int *M, int *colsum)
// {
// int col = blockIdx.x * blockDim.x + threadIdx.x;
// if (col < N) {
// colsum[col] = 0;
// for (int row = 0; row < N; row++) {
// colsum[col] += M[row * N + col];
// }
// }
// }
//
// /* CUDA核函数 - 行列求和 */
// __global__ void cudaRowColSum(int *M, int *rowsum, int *colsum)
// {
// int idx = blockIdx.x * blockDim.x + threadIdx.x;
// if (idx < N) {
// // 计算行和
// rowsum[idx] = 0;
// for (int j = 0; j < N; j++) {
// rowsum[idx] += M[idx * N + j];
// }
//
// // 计算列和
// colsum[idx] = 0;
// for (int i = 0; i < N; i++) {
// colsum[idx] += M[i * N + idx];
// }
// }
// }
//
// /*
// 这个表格包含多个数组元素,每一组元素(函数名字, COL/ROWCOL, "描述字符串"
// COL表示该函数仅仅计算每一列的和
// ROWCOL表示该函数计算每一行、每一列的和
// 将你认为最好的两个实现,放在最前面。
// 比如:
// {my_c_sum1, "超级垃圾列求和实现"},
// {my_rc_sum2, "好一点的行列求和实现"},
// */
//
// rc_fun_rec rc_fun_tab[] =
// {
//
// /* 第一项,应当是你写的最好列求和的函数实现 */
// {cuda_c_sum, COL, "CUDA optimized column sum"},
// /* 第二项,应当是你写的最好行列求和的函数实现 */
// {cuda_rc_sum, ROWCOL, "CUDA optimized row and column sum"},
//
// {c_sum, COL, "Column sum, reference implementation"},
//
// {rc_sum, ROWCOL, "Row and column sum, reference implementation"},
//
// /* 下面的代码不能修改或者删除!!表明数组列表结束 */
// {NULL,ROWCOL,NULL}
// };