You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求GF(2)域改进型CSR矩阵转置实现方案(含并行前缀和函数)

GF(2)改进型CSR矩阵转置实现

核心思路

转置GF(2)域的改进型CSR矩阵,核心是将原矩阵的行-列非零映射转换为列-行映射,具体分为三步:统计每列非零元数量、计算转置后的行偏移、填充转置后的列索引数组。

实现步骤与代码

1. 统计原矩阵每列的非零元数量

遍历原矩阵所有非零元的列索引,统计每列出现的次数,结果将作为转置后矩阵的nonzeros_per_row。

GF2_CSR_Matrix transpose(const GF2_CSR_Matrix& mat) {
    GF2_CSR_Matrix transposed;
    transposed.rows = mat.columns;
    transposed.columns = mat.rows;
    transposed.non_zero = mat.non_zero;

    // 统计每列的非零元数量
    std::vector<uint64_t> col_nz_counts(mat.columns, 0);
    // 并行遍历列索引,线程安全地更新计数
    #pragma omp parallel for
    for (uint64_t idx = 0; idx < mat.column_indexes.size(); ++idx) {
        uint64_t c = mat.column_indexes[idx];
        #pragma omp atomic
        col_nz_counts[c]++;
    }
    transposed.nonzeros_per_row = std::move(col_nz_counts);

2. 计算转置后的行前缀和

调用你提供的calculate_prefix_sum函数,生成转置后矩阵每行的起始/结束索引,用于后续填充列索引数组。

// 计算转置后的行范围前缀和
    std::vector<std::pair<uint64_t, uint64_t>> transposed_row_ranges;
    calculate_prefix_sum(transposed_row_ranges, transposed.nonzeros_per_row);

3. 填充转置后的列索引数组

先计算原矩阵每行的非零元范围,再遍历每行的非零元,将原行索引映射到转置后矩阵的对应位置。

// 计算原矩阵的行范围前缀和(获取每行在column_indexes中的起止位置)
    std::vector<std::pair<uint64_t, uint64_t>> original_row_ranges;
    calculate_prefix_sum(original_row_ranges, mat.nonzeros_per_row);

    // 初始化临时偏移数组,记录每列当前填充到的位置
    std::vector<uint64_t> temp_offset(mat.columns, 0);
    for (uint64_t c = 0; c < mat.columns; ++c) {
        temp_offset[c] = transposed_row_ranges[c].first;
    }

    transposed.column_indexes.resize(mat.non_zero);

    // 并行填充转置后的列索引数组
    #pragma omp parallel for
    for (uint64_t i = 0; i < mat.rows; ++i) {
        uint64_t start = original_row_ranges[i].first;
        uint64_t end = original_row_ranges[i].second;
        for (uint64_t idx = start; idx < end; ++idx) {
            uint64_t c = mat.column_indexes[idx];
            uint64_t pos = __sync_fetch_and_add(&temp_offset[c], 1);
            transposed.column_indexes[pos] = i;
        }
    }

    return transposed;
}

关键细节说明

  • 并行化优化:统计列计数和填充转置数组时使用OpenMP并行指令,匹配你已有并行前缀和函数的设计逻辑,充分利用多核资源。
  • 线程安全保障:统计列计数用#pragma omp atomic避免竞争;填充时用__sync_fetch_and_add原子操作更新偏移量,确保多线程下数据一致性。
  • 原矩阵行范围处理:因为原矩阵nonzeros_per_row仅存储每行非零元个数,必须通过calculate_prefix_sum生成行起止位置,才能正确遍历每行的非零元列索引。

内容的提问来源于stack exchange,提问作者nezudem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:02:31