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

Posted

技术标签:

【中文标题】读取缓冲区拥有的访问内存【英文标题】:Access memory owned by read buffer 【发布时间】:2021-06-14 16:45:13 【问题描述】:

根据SYCLreference

缓冲区可以由主机数据指针初始化。虽然缓冲区存在,但它拥有主机数据,并且在此期间对主机数据指针的直接访问是未定义的。

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

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] << ' ';

【问题讨论】:

【参考方案1】:

缓冲区 in_buf(input_buffer, 缓冲区大小); auto x = in_buf.get_accessaccess::mode::read(h);

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

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

【讨论】:

以上是关于读取缓冲区拥有的访问内存的主要内容,如果未能解决你的问题,请参考以下文章

WebGL:读取缓冲区对象的内容?

Go_bufio包

缓冲区

StreamReader缓冲GZIP的流式HTTP?

使用 ByteBuffer 从 Socket 读取的更快方法?

Windows地址空间