Commit fb7cf0ee authored by Joseph Noir's avatar Joseph Noir

spawn signature changed

global and local dimension must now be passed as a vector
parent a854615b
......@@ -97,7 +97,7 @@ class command_impl : public command {
/* enqueue kernel */
err = clEnqueueNDRangeKernel(m_queue.get(),
m_kernel.get(),
3,
m_global_dimensions.size(),
NULL,
m_global_dimensions.data(),
m_local_dimensions.data(),
......
......@@ -83,24 +83,19 @@ class command_dispatcher {
void enqueue();
template<typename Ret, typename... Args>
actor_ptr spawn__(const program& prog,
const char* kernel_name,
size_t global_dim_1,
size_t global_dim_2,
size_t global_dim_3,
size_t local_dim_1,
size_t local_dim_2,
size_t local_dim_3,
std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> map_args,
std::function<any_tuple(Ret&)> map_result)
actor_ptr spawn(const program& prog,
const char* kernel_name,
std::vector<size_t> global_dims,
std::vector<size_t> local_dims,
std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> map_args,
std::function<any_tuple(Ret&)> map_result)
{
std::vector<size_t> local_dims{local_dim_1, local_dim_2, local_dim_3};
auto i = std::find(local_dims.begin(), local_dims.end(), 0);
if (i != local_dims.end()) local_dims.clear();
return new actor_facade<Ret (Args...)>(this,
prog,
kernel_name,
{global_dim_1, global_dim_2, global_dim_3},
global_dims,
local_dims,
map_args,
map_result);
......@@ -109,12 +104,8 @@ class command_dispatcher {
template<typename Ret, typename... Args>
actor_ptr spawn(const program& prog,
const char* kernel_name,
size_t global_dim_1,
size_t global_dim_2 = 1,
size_t global_dim_3 = 1,
size_t local_dim_1 = 0,
size_t local_dim_2 = 0,
size_t local_dim_3 = 0)
std::vector<size_t> global_dims = {1,1,1},
std::vector<size_t> local_dims = {0,0,0})
{
std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> f0 = [] (any_tuple msg) {
return tuple_cast<typename util::rm_ref<Args>::type...>(msg);
......@@ -122,80 +113,13 @@ class command_dispatcher {
std::function<any_tuple(Ret&)> f1 = [] (Ret& result) {
return make_any_tuple(std::move(result));
};
return this->spawn__<Ret,Args...>(prog,
kernel_name,
global_dim_1,
global_dim_2,
global_dim_3,
local_dim_1,
local_dim_2,
local_dim_3,
std::move(f0),
std::move(f1));
}
/*
template<typename Ret, typename... Args>
actor_ptr spawn(const program& prog,
const char* kernel_name,
size_t global_dim_1,
size_t global_dim_2 = 1,
size_t global_dim_3 = 1,
size_t local_dim_1 = 0,
size_t local_dim_2 = 0,
size_t local_dim_3 = 0) {
std::vector<size_t> global_dims {global_dim_1,
global_dim_2,
global_dim_3};
std::vector<size_t> local_dims {local_dim_1,
local_dim_2,
local_dim_3};
auto f_remove_invalid = [] (size_t s) { return s <= 0; };
// auto global_invalid = std::remove_if(global_dims.begin(),
// global_dims.end(),
// f_remove_invalid);
// global_dims.erase(global_invalid, global_dims.end());
auto local_invalid = std::remove_if(local_dims.begin(),
local_dims.end(),
f_remove_invalid);
local_dims.erase(local_invalid, local_dims.end());
return new actor_facade<Ret (Args...)>(this,
prog,
kernel_name,
global_dims,
local_dims);
}
template<typename Ret, typename... Args>
actor_ptr spawn(const char* kernel_source,
const char* kernel_name,
size_t global_dim_1,
size_t global_dim_2 = 1,
size_t global_dim_3 = 1,
size_t local_dim_1 = 0,
size_t local_dim_2 = 0,
size_t local_dim_3 = 0) {
return spawn<Ret, Args...>(program::create(kernel_source),
kernel_name,
global_dim_1,
global_dim_2,
global_dim_3,
local_dim_1,
local_dim_2,
local_dim_3);
}
template<typename Ret, typename... Args>
actor_ptr spawn(const program& prog,
const char* kernel_name) {
return new actor_facade<Ret (Args...)>(this, prog, kernel_name);
}
template<typename Ret, typename... Args>
actor_ptr spawn(const char* kernel_source,
const char* kernel_name) {
return spawn<Ret, Args...>(program::create(kernel_source), kernel_name);
return this->spawn<Ret,Args...>(prog,
kernel_name,
global_dims,
local_dims,
std::move(f0),
std::move(f1));
}
*/
private:
......
......@@ -47,7 +47,7 @@ int main() {
announce<vector<int>>();
announce<vector<float>>();
int size{6};
size_t size{6};
auto prog = program::create(kernel_source);
command_dispatcher* disp =
......@@ -56,7 +56,7 @@ int main() {
auto matrix_global = disp->spawn<vector<float>,
vector<float>,
vector<float>>(prog, "matrix",
size, size);
{size, size});
vector<float> m1(size * size);
vector<float> m2(size * size);
......@@ -69,8 +69,8 @@ int main() {
receive (
on_arg_match >> [&] (const vector<float>& result) {
cout << "results:" << endl;
for (int y{0}; y < size; ++y) {
for (int x{0}; x < size; ++x) {
for (unsigned y{0}; y < size; ++y) {
for (unsigned x{0}; x < size; ++x) {
cout << fixed << setprecision(2) << setw(8) << result[x+y*size];
}
cout << endl;
......@@ -85,8 +85,8 @@ int main() {
cout << endl;
auto matrix_local = disp->spawn<vector<float>,
vector<float>>(prog, "dimensions",
size, size, 1,
(size/3), (size/2), 1);
{size, size, 1},
{(size/3), (size/2), 1});
m1.clear();
m1.push_back(0.0); // dummy
......@@ -96,8 +96,8 @@ int main() {
receive (
on_arg_match >> [&] (const vector<float>& result) {
cout << "dimenson example:" << endl;
for (int y{0}; y < size; ++y) {
for (int x{0}; x < size; ++x) {
for (unsigned y{0}; y < size; ++y) {
for (unsigned x{0}; x < size; ++x) {
cout << fixed << setprecision(2) << setw(6) << result[x+y*size];
}
cout << endl;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment