tiling_1d.c 3.94 KB
Newer Older
Swann Perarnau's avatar
Swann Perarnau committed
1
2
3
4
5
6
7
8
9
10
/*******************************************************************************
 * Copyright 2019 UChicago Argonne, LLC.
 * (c.f. AUTHORS, LICENSE)
 *
 * This file is part of the AML project.
 * For more info, see https://xgitlab.cels.anl.gov/argo/aml
 *
 * SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/

11
#include "aml.h"
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <assert.h>

/*******************************************************************************
 * 1D Iterator
 ******************************************************************************/

int aml_tiling_iterator_1d_reset(struct aml_tiling_iterator_data *data)
{
	struct aml_tiling_iterator_1d_data *it =
		(struct aml_tiling_iterator_1d_data *)data;
	it->i = 0;
	return 0;
}

Kamil Iskra's avatar
Kamil Iskra committed
26
int aml_tiling_iterator_1d_end(const struct aml_tiling_iterator_data *data)
27
{
Kamil Iskra's avatar
Kamil Iskra committed
28
29
	const struct aml_tiling_iterator_1d_data *it =
		(const struct aml_tiling_iterator_1d_data *)data;
30
31
32
33
34
35
36
37
38
39
40
	return it->i * it->tiling->blocksize >= it->tiling->totalsize;
}

int aml_tiling_iterator_1d_next(struct aml_tiling_iterator_data *data)
{
	struct aml_tiling_iterator_1d_data *it =
		(struct aml_tiling_iterator_1d_data *)data;
	it->i++;
	return 0;
}

Kamil Iskra's avatar
Kamil Iskra committed
41
int aml_tiling_iterator_1d_get(const struct aml_tiling_iterator_data *data,
42
43
			       va_list args)
{
Kamil Iskra's avatar
Kamil Iskra committed
44
45
	const struct aml_tiling_iterator_1d_data *it =
		(const struct aml_tiling_iterator_1d_data *)data;
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
	unsigned long *x = va_arg(args, unsigned long *);
	*x = it->i;
	return 0;
}

struct aml_tiling_iterator_ops aml_tiling_iterator_1d_ops = {
	aml_tiling_iterator_1d_reset,
	aml_tiling_iterator_1d_next,
	aml_tiling_iterator_1d_end,
	aml_tiling_iterator_1d_get,
};

/*******************************************************************************
 * 1D ops
 ******************************************************************************/

62
63
64
65
66
67
68
69
int aml_tiling_1d_tileid(const struct aml_tiling_data *t, va_list ap)
{
	const struct aml_tiling_1d_data *data =
		(const struct aml_tiling_1d_data *)t;
	size_t x = va_arg(ap, size_t);
	return x;
}

Kamil Iskra's avatar
Kamil Iskra committed
70
size_t aml_tiling_1d_tilesize(const struct aml_tiling_data *t, int tileid)
71
{
Kamil Iskra's avatar
Kamil Iskra committed
72
73
	const struct aml_tiling_1d_data *data =
		(const struct aml_tiling_1d_data *)t;
74
75
76
77
	if(tileid < 0)
		return 0;
	else
		return data->blocksize;
78
79
}

Kamil Iskra's avatar
Kamil Iskra committed
80
void* aml_tiling_1d_tilestart(const struct aml_tiling_data *t, const void *ptr, int tileid)
81
{
Kamil Iskra's avatar
Kamil Iskra committed
82
83
	const struct aml_tiling_1d_data *data =
		(const struct aml_tiling_1d_data *)t;
84
	intptr_t p = (intptr_t)ptr;
85
86
87
88
	if(tileid < 0)
		return NULL;
	else
		return (void *)(p + tileid*data->blocksize);
89
90
}

91
92
93
94
95
96
97
98
99
100
101
int aml_tiling_1d_ndims(const struct aml_tiling_data *t, va_list ap)
{
	const struct aml_tiling_1d_data *data =
		(const struct aml_tiling_1d_data *)t;
	size_t *x = va_arg(ap, size_t *);
	*x = data->totalsize/data->blocksize;
	if(data->totalsize % data->blocksize != 0)
		*x++;
	return 0;
}

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
int aml_tiling_1d_init_iterator(struct aml_tiling_data *t,
				struct aml_tiling_iterator *it, int flags)
{
	assert(it->data != NULL);
	struct aml_tiling_iterator_1d_data *data = 
		(struct aml_tiling_iterator_1d_data *)it->data;
	it->ops = &aml_tiling_iterator_1d_ops;
	data->i = 0;
	data->tiling = (struct aml_tiling_1d_data *)t;
	return 0;
}

int aml_tiling_1d_create_iterator(struct aml_tiling_data *t,
				  struct aml_tiling_iterator **it, int flags)
{
	intptr_t baseptr, dataptr;
	struct aml_tiling_iterator *ret;
	baseptr = (intptr_t) calloc(1, AML_TILING_ITERATOR_1D_ALLOCSIZE);
	dataptr = baseptr + sizeof(struct aml_tiling_iterator);
	
	ret = (struct aml_tiling_iterator *)baseptr;
	ret->data = (struct aml_tiling_iterator_data *)dataptr;

	aml_tiling_1d_init_iterator(t, ret, flags);
	*it = ret;
	return 0;
}

int aml_tiling_1d_destroy_iterator(struct aml_tiling_data *t,
				   struct aml_tiling_iterator *it)
{
	return 0;
}

struct aml_tiling_ops aml_tiling_1d_ops = {
	aml_tiling_1d_create_iterator,
	aml_tiling_1d_init_iterator,
	aml_tiling_1d_destroy_iterator,
140
	aml_tiling_1d_tileid,
141
142
	aml_tiling_1d_tilesize,
	aml_tiling_1d_tilestart,
143
	aml_tiling_1d_ndims,
144
};