- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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();
}
}
我得到
两个 错误,沿线指示:
invalid operands to binary expression ('const std::vector<double, std::allocator<double>>' and 'const std::vector<double, std::allocator<double>>')
no viable overloaded '='
invalid operands for binary expression (...)
的错误,但它们似乎都没有帮助调试我的具体案例。也许是因为这对初学者不友好。
a_host.data()
显示返回类型
std::vector<double>
(不应该是
std::vector< std::vector<double> >
吗?)。
std::array
具有静态已知的大小,并且可以正常工作。
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/
我正在开发与 oneAPI basekit 一起提供的 vectorAdd 示例应用程序。当我尝试在内核中打印总和时,出现以下错误。 请查收附件源码及编译错误 //Source code cg
我是 SYCL/OpenCL/GPGPU 的新手。我正在尝试构建和运行常量加法程序的示例代码, #include #include #include #include namespace sy
我正在尝试了解 OpenCL 生态系统以及 Vulkan 如何发挥作用。 我了解 OpenCL 是一个在 GPU 和 CPU 上执行代码的框架,使用可编译为 SPIR 的内核。 Vulkan 还可以使
我是 stackoverflow、sycl 和 gpu 编程的新手。我有一个带有基本 sycl 内核的项目。逻辑是有效的,所以我在问题中跳过它。另外在编译和执行过程中也没有错误。 现在最大的问题是 s
在 sycl 中,我们创建这样一个内核: queue.submit( [&d_cells, &d_count_occupied](sycl::handler& cgh) { auto cel
以下玩具代码使用 Intel OneAPI beta6。 #include #include namespace sycl = cl::sycl; const int SIZE=1; class
以下玩具代码使用 Intel OneAPI beta6。 #include #include namespace sycl = cl::sycl; const int SIZE=1; class
假设我有以下包含缓冲区的结构: struct SomeAllocatorCode { int* rawData; size_t rawDataSize; cl::sycl::buffer
我在 SYCL 中进行矩阵乘法,并且有一个工作代码,其中我在 parallel_for 中使用了 only range 而不是使用 nd_range 在 parallel_for 中。现在我想在其中使
使用 SYCL 在任何 OpenCL 设备上运行代码不需要自定义编译器,因为一切都在库中完成(充满模板魔法),标准的 GCC/Clang 就可以了。它是否正确? (特别是在我使用的 triSYCL 的
我正在尝试使用 gdb 来跟踪具有 Eigen SYCL 支持的 Tensorflow 操作内核实现。 但是,当我尝试安装 .whl包,关于 fglrx 的一些错误消息弹出。 错误信息 Compili
我正在尝试安装tensorflow Please specify the location where ComputeCpp for SYCL 1.2 is installed. [Default i
我正在尝试在 GPU 上访问具有多个间接级别的数据结构。我现在拥有的示例层次结构是 A 包含 B 包含 C。每个包含数据。 A 包含指向 B 的指针,B 包含指向 C 的指针。当释放包含访问器的堆分配
我正在使用 Xilinx 的 triSYCL github 实现,https://github.com/triSYCL/triSYCL . 我正在尝试用 100 cl::sycl::pipes 创建一
我正在使用 Xilinx 的 triSYCL github 实现,https://github.com/triSYCL/triSYCL . 我正在尝试创建一个包含 100 个生产者/消费者的设计,以从
我尝试分析我的函数在设备上的执行时间。我读了这个链接: https://docs.oneapi.com/versions/latest/dpcpp/iface/event.html但是我没有在文档中找
想开始用SYCL,但是目前发现需要安装ComputeCpp它只支持 Ubuntu、CentOS 和 Windows。在 MacOS Catalina 上使用 SYCL 的替代方法有哪些? 最佳答案 概
我是 SYCL 和 C++ 的新手。这是我使用 2D std::vector 进行简单矩阵乘法的内核. void MatrixMulParallel(queue& q, const std::
我尝试编写一种“映射”类,它通过一些指定目标类型(CPU 或 GPU/加速器)的参数来包装 OneAPI 调用以隐藏硬件定位问题。 映射,将代码定向到 SYCL 内核或 TBB 以通过并行 for 实
我克隆了 https://github.com/codeplaysoftware/computecpp-sdk.git并修改了 computecpp-sdk/samples/accessors/acc
我是一名优秀的程序员,十分优秀!