Как мне получить статус Concurrency :: complete_future?

Я только что прочитал это:

Получить статус 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");
}

Почему это утверждение потерпит неудачу?

1

Решение

Поведение, наблюдаемое в ОП, является правильным.

array_view<int> av(big) создает массив без источника данных, в то время как av.synchronize_async() синхронизирует модификации к источнику данных. Поэтому для array_view без источника данных это по определению no-op. По расширению это также не принуждает к выполнению предыдущего parallel_for_each,

Если целью является синхронизация данных с памятью ЦП, в этом случае их необходимо явно запросить с помощью av.synchronize_to_async(accelerator(accelerator::cpu_accelerator).default_view), Конечно вернувшийся completion_future становится готовым только тогда, когда предыдущий parallel_for_each и (необязательно) завершение операции копирования.

Замена первого вызова синхронизации последним делает утверждение успешным, имея в виду, что оно все еще может не сработать (по замыслу) в системах с общей памятью ЦП или в некоторых редких случаях.

4

Другие решения

Отказ от ответственности: я не эксперт в AMP.

НАСКОЛЬКО МНЕ ИЗВЕСТНО, array_view ничего не представляет само по себе. Это просто вид, который вы должны привязать к чему-либо. Так что ваш код, по сути, не имеет смысла для меня. У вас нет внутренней памяти на ЦП, с которой вам нужно синхронизироваться.

Попробуйте следующий код:

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

int main()
{
using namespace Concurrency;
using namespace std;
int big = 100000000; // this should take a while to send back to the host
vector<int> vec(big);
iota(begin(vec), end(vec), 0);
array_view<int, 1> av(big, vec);

parallel_for_each(Concurrency::extent<1>(big), [=](index<1> idx) restrict(amp)
{
av[idx] = av[idx] * av[idx];
});
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();
std::cout << vec[5];
}

Это просто твоя модификация, которая работает как положено.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector