gpt4 book ai didi

c++ - 如何获取 Concurrency::completion_future 的状态?

转载 作者:行者123 更新时间:2023-11-30 01:20:02 24 4
gpt4 key购买 nike

我刚刚读到这个:

Get the status of a std::future

因为 Concurrency::completion_future 的功能似乎模仿了 std::future 我想我可以做类似的事情,但是这个相对简单的例子失败了:

#include <assert.h>
#include <chrono>
#include <iostream>
#include <amp.h>

int main()
{
using namespace Concurrency;
int big = 1000000; // this should take a while to send back to the host
array_view<int> av(big);

parallel_for_each(extent<1>(big), [=](index<1> idx) restrict(amp)
{
av[idx] = idx[0];
});
int i = 0;
completion_future future = av.synchronize_async();

// this should be false; how could it instantly sent back so much data?
bool const gpuFinished = future.wait_for(std::chrono::seconds(0)) == std::future_status::ready;

assert(!gpuFinished); // FAIL! why?

future.wait();

system("pause");
}

为什么断言会失败?

最佳答案

在 OP 中观察到的行为是正确的。

array_view<int> av(big)创建一个数组 View 没有数据源,而av.synchronize_async()将修改同步到数据源。因此,对于没有数据源的 array_view,根据定义,它是无操作的。通过扩展,它也不会强制执行前面的 parallel_for_each .

如果目的是将数据同步到 CPU 内存,在这种情况下需要使用 av.synchronize_to_async(accelerator(accelerator::cpu_accelerator).default_view) 显式请求。 .当然返回了completion_future只有在前面的 parallel_for_each 时才准备就绪和(可选)复制操作完成。

将前者的同步调用替换为后者会使断言成功,请记住,它在具有 CPU 共享内存的系统上或在某些罕见的时机上仍可能(按设计)失败。

关于c++ - 如何获取 Concurrency::completion_future 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19995996/

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