| 113 | /// |
| 114 | template<class InputIterator1, class InputIterator2> |
| 115 | inline bool includes(InputIterator1 first1, |
| 116 | InputIterator1 last1, |
| 117 | InputIterator2 first2, |
| 118 | InputIterator2 last2, |
| 119 | command_queue &queue = system::default_queue()) |
| 120 | { |
| 121 | int tile_size = 1024; |
| 122 | |
| 123 | int count1 = detail::iterator_range_size(first1, last1); |
| 124 | int count2 = detail::iterator_range_size(first2, last2); |
| 125 | |
| 126 | vector<uint_> tile_a((count1+count2+tile_size-1)/tile_size+1, queue.get_context()); |
| 127 | vector<uint_> tile_b((count1+count2+tile_size-1)/tile_size+1, queue.get_context()); |
| 128 | |
| 129 | // Tile the sets |
| 130 | detail::balanced_path_kernel tiling_kernel; |
| 131 | tiling_kernel.tile_size = tile_size; |
| 132 | tiling_kernel.set_range(first1, last1, first2, last2, |
| 133 | tile_a.begin()+1, tile_b.begin()+1); |
| 134 | fill_n(tile_a.begin(), 1, 0, queue); |
| 135 | fill_n(tile_b.begin(), 1, 0, queue); |
| 136 | tiling_kernel.exec(queue); |
| 137 | |
| 138 | fill_n(tile_a.end()-1, 1, count1, queue); |
| 139 | fill_n(tile_b.end()-1, 1, count2, queue); |
| 140 | |
| 141 | vector<uint_> result((count1+count2+tile_size-1)/tile_size, queue.get_context()); |
| 142 | |
| 143 | // Find individually |
| 144 | detail::serial_includes_kernel includes_kernel; |
| 145 | includes_kernel.tile_size = tile_size; |
| 146 | includes_kernel.set_range(first1, first2, tile_a.begin(), tile_a.end(), |
| 147 | tile_b.begin(), result.begin()); |
| 148 | |
| 149 | includes_kernel.exec(queue); |
| 150 | |
| 151 | return find(result.begin(), result.end(), 0, queue) == result.end(); |
| 152 | } |
| 153 | |
| 154 | } //end compute namespace |
| 155 | } //end boost namespace |