22 #ifndef HMLP_DEVICE_HPP 23 #define HMLP_DEVICE_HPP 63 void Bind(
void *ptr_h );
65 bool isCache(
void *ptr_h,
size_t size );
131 virtual class CacheLine *getline(
size_t size );
133 virtual void prefetchd2h(
void *ptr_h,
void *ptr_d,
size_t size,
int stream_id );
135 virtual void prefetchh2d(
void *ptr_d,
void *ptr_h,
size_t size,
int stream_id );
137 virtual void waitexecute();
139 virtual void wait(
int stream_id );
141 virtual void *malloc(
size_t size );
143 virtual void malloc(
void *ptr_d,
size_t size );
145 virtual size_t get_memory_left();
147 virtual void free(
void *ptr_d,
size_t size );
149 DeviceType devicetype;
172 distribution.insert( host );
177 if ( !isCached( size ) )
180 cache = dev->getline( size );
182 Redistribute<true>( host );
194 if ( !device_map.count( dev ) )
196 T *ptr_d = (T*)dev->malloc( size );
197 if ( !ptr_d )
return;
198 device_map[ dev ] = ptr_d;
205 if ( device_map.count( dev ) )
207 if ( !device_map[ dev ] )
209 printf(
"NULL device ptr in device_map\n" ); fflush( stdout );
211 dev->free( device_map[ dev ], size );
212 device_map.erase( dev );
213 distribution.erase( dev );
220 this->stream_id = stream_id;
226 if ( !distribution.count( dev ) )
228 dev->prefetchh2d( cache->device_data(), ptr_h, size, stream_id );
230 Redistribute<false>( dev );
236 if ( !distribution.count( dev ) )
239 AllocateD( dev, size );
248 dev->prefetchh2d( device_map[ dev ], ptr_h, size, stream_id );
251 Redistribute<false>( dev );
256 assert( device_map.find( dev ) != device_map.end() );
264 this->stream_id = stream_id;
269 if ( !distribution.count( host ) )
271 dev->prefetchd2h( ptr_h, cache->device_data(), size, stream_id );
272 Redistribute<false>( host );
277 if ( !distribution.count( host ) )
280 assert( device_map.count( dev ) );
281 dev->prefetchd2h( ptr_h, device_map[ dev ], size, stream_id );
282 Redistribute<false>( host );
287 assert( device_map.count( host ) );
292 void FetchH2D(
hmlp::Device *dev,
size_t size, T* ptr_h )
294 PrefetchH2D( dev, stream_id, size, ptr_h );
295 dev->wait( stream_id );
298 void FetchD2H(
hmlp::Device *dev,
size_t size, T* ptr_h )
300 PrefetchD2H( dev, stream_id, size, ptr_h );
301 dev->wait( stream_id );
307 dev->wait( stream_id );
315 template<
bool OVERWRITE>
319 if ( OVERWRITE ) distribution.clear();
320 distribution.insert( dev );
325 return distribution.count( dev );
332 return (T*)cache->device_data();
336 auto it = device_map.find( dev );
337 if ( it == device_map.end() )
339 printf(
"no device pointer for the target device\n" );
342 return device_map[ dev ];
354 std::map<hmlp::Device*, T*> device_map;
357 std::set<hmlp::Device*> distribution;
361 bool isCached(
size_t size )
363 bool iscached =
false;
366 iscached = cache->isCache(
this, size );
375 #endif //#define HMLP_DEVICE_HPP Definition: device.hpp:162
class Device * hmlp_get_device_host()
Definition: runtime.cpp:1483
void AllocateD(hmlp::Device *dev, size_t size)
Definition: device.hpp:192
void FreeD(hmlp::Device *dev, size_t size)
Definition: device.hpp:203
void PrefetchH2D(hmlp::Device *dev, int stream_id, size_t size, T *ptr_h)
Definition: device.hpp:218
void CacheD(hmlp::Device *dev, size_t size)
Definition: device.hpp:175
DeviceMemory()
Definition: device.hpp:169
Definition: device.hpp:53
void Redistribute(hmlp::Device *dev)
Definition: device.hpp:316
This class describes devices or accelerators that require a master thread to control. A device can accept tasks from multiple workers. All received tasks are expected to be executed independently in a time-sharing fashion. Whether these tasks are executed in parallel, sequential or with some built-in context switching scheme does not matter.
Definition: device.hpp:125
void PrefetchD2H(hmlp::Device *dev, int stream_id, size_t size, T *ptr_h)
Definition: device.hpp:262
Definition: device.hpp:82
Definition: thread.hpp:166