使用OpenGL的计算着色器对矩阵并行计算

int main() {

    // 初始化GLFW
    vtkRenderWindow* renWin = vtkRenderWindow::New();
    renWin->SetWindowName(false ? "Server Window" : "Client Window");
    renWin->Render();

    std::string shader(
        "#version 450\n"
        "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"

        "layout(std430, binding = 0) buffer InputBuffer {\n"
        "int data[60]; // 6*10 的二维矩阵\n"
        "};\n"

        "layout(std430, binding = 1) buffer OutputBuffer {\n"
        "int result[10]; // 1*10 的输出矩阵\n"
        "};\n"

        "void main() {\n"
        "uint col = gl_GlobalInvocationID.x;\n"
        "int sum = 0;\n"

        "for (int row = 0; row < 6; row++) {\n"
        "    sum += data[row * 10 + col];\n"
        " }\n"

        "result[col] = sum;\n"
        "}\n"
    );
   
    GLuint inputBuffer, outputBuffer;
    glGenBuffers(1, &inputBuffer);
    glGenBuffers(1, &outputBuffer);

    // 绑定输入缓冲区和输出缓冲区
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, inputBuffer);
    

    int inputData[60] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                         11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
                         21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
                         31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
                         41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                         51, 52, 53, 54, 55, 56, 57, 58, 59, 60 };
   
    int m_DataSize = sizeof(inputData);
    std::cerr << "m_DataSize:" << m_DataSize << endl;
    glBufferData(GL_SHADER_STORAGE_BUFFER, m_DataSize, inputData, GL_DYNAMIC_COPY);

    int outputData[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
    };
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, outputBuffer);
    m_DataSize = sizeof(outputData);
    glBufferData(GL_SHADER_STORAGE_BUFFER, m_DataSize, outputData, GL_DYNAMIC_COPY);


    auto m_ProgramObj = LoadComputeShader(shader.c_str());
    glUseProgram(m_ProgramObj);
    //2x4
    int numGroupX = 10;
    int numGroupY = 1;
    glDispatchCompute(numGroupX, numGroupY, 1);
    glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

    // 读取并打印处理后的数据
    //glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(outputData), outputData);

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, outputBuffer);
    auto* mappedData = (int*)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, m_DataSize, GL_MAP_READ_BIT);

    // 打印输出数据
    for (int i = 0; i < 10; i++) {
        //std::cout << "Column " << i << " sum: " << outputData[i] << std::endl;
        std::cout << "Column " << i << " sum: " << mappedData[i] << std::endl;
    }
    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
    return 0;
}

代码功能为对一个6*10(6行10列)的矩阵求列向量的和,输出1*10的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值