gpt4 book ai didi

c++ - 使用 2D std::vector 对 SYCL 进行矩阵乘法

转载 作者:行者123 更新时间:2023-12-03 07:15:44 25 4
gpt4 key购买 nike

我是 SYCL 和 C++ 的新手。这是我使用 2D std::vector 进行简单矩阵乘法的内核.


void MatrixMulParallel(queue& q,
const std::vector<std::vector<double>>& a_host,
const std::vector<std::vector<double>>& b_host,
std::vector<std::vector<double>>& c_gpu) {
/*
To Multiply: C[M][P] = A[M][N] * B[N][P]
*/
PROFILE_FUNCTION();
try {
size_t M = a_host.size();
size_t N = a_host[0].size();
size_t P = b_host[0].size();
// Create device buffers for A, B, C
buffer a(a_host.data(), range<2>{M, N});
buffer b(b_host.data(), range<2>{N, P});
buffer c(c_gpu.data(), range<2>{M, P});

PROFILE_SCOPE("Starting Multiply on GPU");
std::cout << "GPU::Multiplying A and B into C.\n";
auto e = q.submit([&](handler& h) {

auto A = a.get_access<access::mode::read>(h);
auto B = b.get_access<access::mode::read>(h);
auto C = c.get_access<access::mode::write>(h);

h.parallel_for(range<2>{M, P}, [=](id<2> index) {
// index[0] allows accessing ROW index, index[1] is column index

int row = index[0];
int col = index[1];
auto sum = 0.0;
for (int i = 0; i < N; i++)
sum += A[row][i] * B[i][col]; // Error #1
C[index] = sum; // Error #2
});
});
e.wait();
}
catch (sycl::exception const& e) {
std::cout << "An exception is caught while multiplying matrices.\n";
terminate();
}
}
我得到 两个 错误,沿线指示:
  • 错误 #1:invalid operands to binary expression ('const std::vector<double, std::allocator<double>>' and 'const std::vector<double, std::allocator<double>>')
  • 错误 #2:no viable overloaded '='

  • 我尝试查找类似于 invalid operands for binary expression (...) 的错误,但它们似乎都没有帮助调试我的具体案例。也许是因为这对初学者不友好。
    据我目前了解, a_host.data()显示返回类型 std::vector<double> (不应该是 std::vector< std::vector<double> > 吗?)。
    我试过使用 std::array具有静态已知的大小,并且可以正常工作。
    如何使用 2D std::vector 完成这项工作?
    任何帮助,将不胜感激。

    最佳答案

    二维std::vector<std::vector<T>>没有元素连续存储在内存中。
    更好的方法是声明 std::vector<T>大小为 M*N,即线性数组,并将它们作为连续 block 进行操作。
    由于目标 vector C ,应该是二维的,创建一个在行和列中都索引的内核。 SYCL index实际上填满了线性可访问的内存块。
    这是我使用 std::vector 使它工作的方法:

    template <typename T>
    void MatrixMulParallelNaive(queue& q,
    const std::vector<T>& a_host,
    const std::vector<T>& b_host,
    std::vector<T>& c_gpu) {
    /*
    To Multiply: C[M][P] = A[M][N] * B[N][P]
    */
    PROFILE_FUNCTION();
    try {

    buffer<double, 1> a(a_host.data(), range<1>{a_host.size()}); // 1D
    buffer<double, 1> b(b_host.data(), range<1>{b_host.size()}); // 1D
    buffer<double, 2> c(c_gpu.data(), range<2>{M, P}); // Create 2D buffer
    PROFILE_SCOPE("Starting Multiply on GPU");
    std::cout << "GPU::Multiplying A and B into C.\n";
    auto e = q.submit([&](handler& h) {

    auto A = a.get_access<access::mode::read>(h);
    auto B = b.get_access<access::mode::read>(h);
    auto C = c.get_access<access::mode::write>(h);

    h.parallel_for(range<2>{M, P}, [=](id<2> index) {
    // Threading index that iterates over C.
    int row = index[0];
    int col = index[1];
    auto sum = 0.0;
    // Compute result of ONE element of C
    for (int i = 0; i < N; i++)
    sum += A[row * M + i] * B[i * N + col];
    C[index] = sum;
    });
    });
    e.wait();
    }
    catch (sycl::exception const& e) {
    std::cout << "An exception is caught while multiplying matrices.\n";
    terminate();
    }
    }


    关于c++ - 使用 2D std::vector 对 SYCL 进行矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64405800/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com