lock.cl
494 Bytes
// Locking
void lock_p(global int * lock, int id)
{
while (atomic_cmpxchg(lock, -1, id) != id) {};
}
void lock_v(global int * lock, int id)
{
atomic_xchg(lock, -1);
}
#define LOCK_P(lock, id) while (atomic_cmpxchg(lock, -1, id) != id) {}
#define LOCK_V(lock, id) while (atomic_cmpxchg(lock, id, -1) != -1) {}
kernel void locktest(
global int *lock,
global int *counter)
{
LOCK_P(lock, get_global_id(0));
*counter = *counter + 1;
LOCK_V(lock, get_global_id(0));
}