微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

读取缓冲区拥有的访问内存

如何解决读取缓冲区拥有的访问内存

根据 SYCL reference

缓冲区可以由主机数据指针初始化。当缓冲区存在时,它拥有主机数据并且在此期间对主机数据指针的直接访问是不确定的。

这对于输出缓冲区来说是可以理解的。但是只读缓冲区呢?在以下代码片段中,在内核完成之前访问只读缓冲区是未定义的行为吗?

range<1> bufer_size{ 100 };

buffer<int> in_buf(input_buffer,bufer_size);
buffer<int> out_buf(output_buffer,bufer_size);

auto my_device = default_selector{};
queue q{ my_device };

q.submit([&](handler& h) {
    auto x = in_buf.get_access<access::mode::read>(h);
    auto y = out_buf.get_access<access::mode::write>(h);

    h.parallel_for(bufer_size,[=](id<1> idx) {
            y[idx] = 100 * x[idx] + 1;
        });
    });

// Is it OK to read input_buffer without waiting for queue to complete?
for (int i = 0; i < size; ++i) {
    std::cout << input_buffer[i] << ' ';
}

解决方法

buffer in_buf(input_buffer,bufer_size);
auto x = in_buf.get_accessaccess::mode::read(h);

由于 in_buf 访问器的访问模式是读取,因此 input_buffer 的内容永远不会在内核内部更新。所以在内核完成之前访问 input_buffer 不会产生任何问题。

但是,如果您尝试在内核完成之前访问 output_buffer(其访问模式为写),您可能会得到不完整/不正确的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。