blob: c0e4fa905b2a478acd028e532ead793ab5ec2026 [file] [log] [blame]
#include <stddef.h>
#include <stdint.h>
#include <omp.h>
#define MIN(x,y) ((x) < (y) ? x : y)
enum { N = 524288 + 8 };
static void
init_val (int8_t *ptr, int val, size_t count)
{
#pragma omp target is_device_ptr(ptr) firstprivate(val, count)
__builtin_memset (ptr, val, count);
}
static void
check_val (int8_t *ptr, int val, size_t count)
{
if (count == 0)
return;
#pragma omp target is_device_ptr(ptr) firstprivate(val, count)
for (size_t i = 0; i < count; i++)
if (ptr[i] != val) __builtin_abort ();
}
static void
test_it (int8_t *ptr, int lshift, size_t count)
{
if (N < count + lshift) __builtin_abort ();
if (lshift >= 4) __builtin_abort ();
ptr += lshift;
init_val (ptr, 'z', MIN (count + 32, N - lshift));
omp_target_memset (ptr, '1', count, omp_get_default_device());
check_val (ptr, '1', count);
check_val (ptr + count, 'z', MIN (32, N - lshift - count));
}
int main()
{
size_t size;
int8_t *ptr = (int8_t *) omp_target_alloc (N + 3, omp_get_default_device());
ptr += (4 - (uintptr_t) ptr % 4) % 4;
if ((uintptr_t) ptr % 4 != 0) __builtin_abort ();
test_it (ptr, 0, 1);
test_it (ptr, 3, 1);
test_it (ptr, 0, 4);
test_it (ptr, 3, 4);
test_it (ptr, 0, 5);
test_it (ptr, 3, 5);
test_it (ptr, 0, 6);
test_it (ptr, 3, 6);
for (int i = 1; i <= 9; i++)
{
switch (i)
{
case 1: size = 16; break; // = 2^4 bytes
case 2: size = 32; break; // = 2^5 bytes
case 3: size = 64; break; // = 2^7 bytes
case 4: size = 128; break; // = 2^7 bytes
case 5: size = 256; break; // = 2^8 bytes
case 6: size = 512; break; // = 2^9 bytes
case 7: size = 65536; break; // = 2^16 bytes
case 8: size = 262144; break; // = 2^18 bytes
case 9: size = 524288; break; // = 2^20 bytes
default: __builtin_abort ();
}
test_it (ptr, 0, size);
test_it (ptr, 3, size);
test_it (ptr, 0, size + 1);
test_it (ptr, 3, size + 1);
test_it (ptr, 3, size + 2);
}
omp_target_free (ptr, omp_get_default_device());
}