File: test_flat_map.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (147 lines) | stat: -rw-r--r-- 5,252 bytes parent folder | download | duplicates (18)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
140
141
142
143
144
145
146
147
//---------------------------------------------------------------------------//
// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
//
// Distributed under the Boost Software License, Version 1.0
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
//
// See http://boostorg.github.com/compute for more information.
//---------------------------------------------------------------------------//

#define BOOST_TEST_MODULE TestFlatMap
#include <boost/test/unit_test.hpp>

#include <utility>

#include <boost/concept_check.hpp>

#include <boost/compute/source.hpp>
#include <boost/compute/container/flat_map.hpp>
#include <boost/compute/type_traits/type_name.hpp>
#include <boost/compute/type_traits/type_definition.hpp>

#include "context_setup.hpp"

BOOST_AUTO_TEST_CASE(concept_check)
{
    BOOST_CONCEPT_ASSERT((boost::Container<boost::compute::flat_map<int, float> >));
//    BOOST_CONCEPT_ASSERT((boost::SimpleAssociativeContainer<boost::compute::flat_map<int, float> >));
//    BOOST_CONCEPT_ASSERT((boost::UniqueAssociativeContainer<boost::compute::flat_map<int, float> >));
    BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<boost::compute::flat_map<int, float>::iterator>));
    BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<boost::compute::flat_map<int, float>::const_iterator>));
}

BOOST_AUTO_TEST_CASE(insert)
{
    boost::compute::flat_map<int, float> map(context);
    map.insert(std::make_pair(1, 1.1f), queue);
    map.insert(std::make_pair(-1, -1.1f), queue);
    map.insert(std::make_pair(3, 3.3f), queue);
    map.insert(std::make_pair(2, 2.2f), queue);
    BOOST_CHECK_EQUAL(map.size(), size_t(4));
    BOOST_CHECK(map.find(-1) == map.begin() + 0);
    BOOST_CHECK(map.find(1) == map.begin() + 1);
    BOOST_CHECK(map.find(2) == map.begin() + 2);
    BOOST_CHECK(map.find(3) == map.begin() + 3);

    map.insert(std::make_pair(2, -2.2f), queue);
    BOOST_CHECK_EQUAL(map.size(), size_t(4));
}

BOOST_AUTO_TEST_CASE(at)
{
    boost::compute::flat_map<int, float> map(context);
    map.insert(std::make_pair(1, 1.1f), queue);
    map.insert(std::make_pair(4, 4.4f), queue);
    map.insert(std::make_pair(3, 3.3f), queue);
    map.insert(std::make_pair(2, 2.2f), queue);
    BOOST_CHECK_EQUAL(float(map.at(1)), float(1.1f));
    BOOST_CHECK_EQUAL(float(map.at(2)), float(2.2f));
    BOOST_CHECK_EQUAL(float(map.at(3)), float(3.3f));
    BOOST_CHECK_EQUAL(float(map.at(4)), float(4.4f));
}

BOOST_AUTO_TEST_CASE(index_operator)
{
    boost::compute::flat_map<int, float> map;
    map[1] = 1.1f;
    map[2] = 2.2f;
    map[3] = 3.3f;
    map[4] = 4.4f;
    BOOST_CHECK_EQUAL(float(map[1]), float(1.1f));
    BOOST_CHECK_EQUAL(float(map[2]), float(2.2f));
    BOOST_CHECK_EQUAL(float(map[3]), float(3.3f));
    BOOST_CHECK_EQUAL(float(map[4]), float(4.4f));
}

BOOST_AUTO_TEST_CASE(custom_kernel)
{
    typedef boost::compute::flat_map<int, float> MapType;

    // map from int->float on device
    MapType map(context);
    map.insert(std::make_pair(1, 1.2f), queue);
    map.insert(std::make_pair(3, 3.4f), queue);
    map.insert(std::make_pair(5, 5.6f), queue);
    map.insert(std::make_pair(7, 7.8f), queue);

    // simple linear search for key in map
    const char lookup_source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
        __kernel void lookup(__global const MapType *map,
                             const int map_size,
                             const KeyType key,
                             __global ValueType *result)
        {
            for(int i = 0; i < map_size; i++){
                if(map[i].first == key){
                    *result = map[i].second;
                    break;
                }
            }
        }
    );

    // create program source
    std::stringstream source;

    // add type definition for map type
    source << boost::compute::type_definition<MapType::value_type>();

    // add lookup function source
    source << lookup_source;

    // create lookup program
    boost::compute::program lookup_program =
        boost::compute::program::create_with_source(source.str(), context);

    // program build options
    std::stringstream options;
    options << "-DMapType=" << boost::compute::type_name<MapType::value_type>()
            << " -DKeyType=" << boost::compute::type_name<MapType::key_type>()
            << " -DValueType=" << boost::compute::type_name<MapType::mapped_type>();

    // build lookup program with options
    lookup_program.build(options.str());

    // create buffer for result value
    boost::compute::vector<float> result(1, context);

    // create lookup kernel
    boost::compute::kernel lookup_kernel = lookup_program.create_kernel("lookup");

    // set kernel arguments
    lookup_kernel.set_arg(0, map.begin().get_buffer()); // map buffer
    lookup_kernel.set_arg<boost::compute::int_>(
        1, static_cast<boost::compute::int_>(map.size())
    ); // map size
    lookup_kernel.set_arg<MapType::key_type>(2, 5); // key
    lookup_kernel.set_arg(3, result.get_buffer()); // result buffer

    // run kernel with a single work-item
    queue.enqueue_task(lookup_kernel);

    // check result from buffer
    BOOST_CHECK_EQUAL(result.begin().read(queue), 5.6f);
}

BOOST_AUTO_TEST_SUITE_END()