Я переписываю алгоритм на C++ AMP и только что столкнулся с проблемой атомарной записи, точнее atomic_fetch_add, которая, по-видимому, предназначена только для целых чисел?
Мне нужно добавить double_4 (или, если нужно, float_4) атомарным способом. Как мне добиться этого с помощью атомарности С++ AMP?
Является ли лучшее/единственное решение иметь переменную блокировки, которую мой код может использовать для управления записью? На самом деле мне нужно выполнять атомарную запись для длинного списка выходных двойников, поэтому мне по сути нужна блокировка для каждого вывода.
Я уже рассматривал возможность тайлинга для повышения производительности, но сейчас я только на первой итерации.
РЕДАКТИРОВАТЬ: Спасибо за уже предоставленные быстрые ответы. У меня есть быстрое обновление моего вопроса.
Я предпринял следующую попытку блокировки, но кажется, что когда один поток в варпе преодолевает блокировку, все остальные потоки в том же варпе просто следуют за ним. Я ожидал, что первый поток деформации получит блокировку, но я должен что-то упустить (обратите внимание, что прошло довольно много лет с тех пор, как я был cuda, поэтому я просто стал тупым)
parallel_for_each(attracting.extent, [=](index<1> idx) restrict(amp)
{
.....
for (int j = 0; j < attracted.extent.size(); j++)
{
...
int lock = 0; //the expected lock value
while (!atomic_compare_exchange(&locks[j], &lock, 1));
//when one warp thread gets the lock, ALL threads continue on
...
acceleration[j] += ...; //locked write
locks[j] = 0; //leaving the lock again
}
});
Это не большая проблема, так как я должен сначала записать в общую переменную и записать ее в глобальную память только после того, как все потоки в плитке будут завершены, но я просто не понимаю этого поведения.
T*
в документах, кажется, предполагает обратное, вам, вероятно, нужно прочитать переменную (из указателя с типом), изменить ее и выполнить сравнение-обмен, опять же, для целочисленного указателя с типом. Когда они говорятT
, они, скорее всего, имеют в виду любое целое число T, а не любое T. - person Damon   schedule 20.06.2014