tiling_1d.c 3.96 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
#include "aml/tiling/1d.h"
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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
27
int aml_tiling_iterator_1d_end(const struct aml_tiling_iterator_data *data)
28
{
Kamil Iskra's avatar
Kamil Iskra committed
29
30
	const struct aml_tiling_iterator_1d_data *it =
		(const struct aml_tiling_iterator_1d_data *)data;
31
32
33
34
35
36
37
38
39
40
41
	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
42
int aml_tiling_iterator_1d_get(const struct aml_tiling_iterator_data *data,
43
44
			       va_list args)
{
Kamil Iskra's avatar
Kamil Iskra committed
45
46
	const struct aml_tiling_iterator_1d_data *it =
		(const struct aml_tiling_iterator_1d_data *)data;
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
	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
 ******************************************************************************/

63
64
65
66
67
68
69
70
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
71
size_t aml_tiling_1d_tilesize(const struct aml_tiling_data *t, int tileid)
72
{
Kamil Iskra's avatar
Kamil Iskra committed
73
74
	const struct aml_tiling_1d_data *data =
		(const struct aml_tiling_1d_data *)t;
75
76
77
78
	if(tileid < 0)
		return 0;
	else
		return data->blocksize;
79
80
}

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

92
93
94
95
96
97
98
99
100
101
102
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;
}

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
140
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,
141
	aml_tiling_1d_tileid,
142
143
	aml_tiling_1d_tilesize,
	aml_tiling_1d_tilestart,
144
	aml_tiling_1d_ndims,
145
};