@@ -356,16 +356,26 @@ RT::PiProgram ProgramManager::createPIProgram(const RTDeviceBinaryImage &Img,
356
356
return Res;
357
357
}
358
358
359
- long GetFileSize (const char *FileName ) {
360
- struct stat Stat;
361
- if (! stat (FileName, &Stat))
362
- return Stat. st_size ;
363
- return - 1 ;
359
+ std::string getDeviceString (const device &Device ) {
360
+ return {Device. get_platform (). get_info <sycl::info::platform::name>() + " / " +
361
+ Device. get_info <sycl::info::device::name>() + " / " +
362
+ Device. get_info <sycl::info::device::version>() + " / " +
363
+ Device. get_info <sycl::info::device::driver_version>()} ;
364
364
}
365
365
366
- inline bool IsFSEntryPresent (const char *Path) {
366
+ std::string DumpBinData (const unsigned char *Data, size_t Size) {
367
+ if (!Size)
368
+ return " NONE" ;
369
+ std::stringstream ss;
370
+ for (size_t i = 0 ; i < Size; i++) {
371
+ ss << std::hex << (int )Data[i];
372
+ }
373
+ return ss.str ();
374
+ }
375
+
376
+ inline bool IsFSEntryPresent (std::string Path) {
367
377
struct stat Stat;
368
- return !stat (Path, &Stat);
378
+ return !stat (Path. c_str () , &Stat);
369
379
}
370
380
371
381
int MakePathRecur (const char *Dir, mode_t Mode) {
@@ -378,14 +388,14 @@ int MakePathRecur(const char *Dir, mode_t Mode) {
378
388
char *CurDir = strdup (Dir);
379
389
MakePathRecur (dirname (CurDir), Mode);
380
390
if (DbgProgMgr > 1 )
381
- std::cerr << " Created directory: " << CurDir << std::endl;
391
+ std::cerr << " #### Created directory: " << CurDir << std::endl;
382
392
383
393
free (CurDir);
384
394
return mkdir (Dir, Mode);
385
395
}
386
396
387
- void WriteCacheItem (const std::string &FileName,
388
- const std::vector<std::vector<char >> &Data) {
397
+ void WriteCacheItemBin (const std::string &FileName,
398
+ const std::vector<std::vector<char >> &Data) {
389
399
std::ofstream FileStream{FileName, std::ios::binary};
390
400
if (DbgProgMgr > 1 ) {
391
401
std::cerr << " ####Writing programs built for " << std::dec << Data.size ()
@@ -396,7 +406,7 @@ void WriteCacheItem(const std::string &FileName,
396
406
FileStream.write ((char *)&Size, sizeof (Size));
397
407
for (size_t i = 0 ; i < Data.size (); ++i) {
398
408
if (DbgProgMgr > 1 ) {
399
- std::cerr << " \t Write " << i << " -th image of size " << std::dec
409
+ std::cerr << " #### \t Write " << i << " -th image of size " << std::dec
400
410
<< Data[i].size () << " \n " ;
401
411
}
402
412
Size = Data[i].size ();
@@ -406,6 +416,36 @@ void WriteCacheItem(const std::string &FileName,
406
416
FileStream.close ();
407
417
}
408
418
419
+ void WriteCacheItemSrc (const std::string &FileName, const device &Device,
420
+ const RTDeviceBinaryImage &Img,
421
+ const SerializedObj &SpecConsts,
422
+ const std::string &BuildOptionsString) {
423
+ std::ofstream FileStream{FileName, std::ios::binary};
424
+ std::string ImgString{
425
+ DumpBinData (Img.getRawData ().BinaryStart , Img.getSize ())};
426
+ std::string DeviceString{getDeviceString (Device)};
427
+ std::string SpecConstsString{
428
+ DumpBinData (SpecConsts.data (), SpecConsts.size ())};
429
+ if (DbgProgMgr > 1 ) {
430
+ std::cerr << " ####Writing source for cache item.\n " ;
431
+ std::cerr << " ####'" <<DeviceString<<" '" <<std::endl;
432
+ }
433
+
434
+ size_t Size = DeviceString.size ();
435
+ FileStream.write ((char *)&Size, sizeof (Size));
436
+ FileStream.write (DeviceString.data (), Size);
437
+ Size = BuildOptionsString.size ();
438
+ FileStream.write ((char *)&Size, sizeof (Size));
439
+ FileStream.write (BuildOptionsString.data (), Size);
440
+ Size = SpecConstsString.size ();
441
+ FileStream.write ((char *)&Size, sizeof (Size));
442
+ FileStream.write (SpecConstsString.data (), Size);
443
+ Size = ImgString.size ();
444
+ FileStream.write ((char *)&Size, sizeof (Size));
445
+ FileStream.write (ImgString.data (), Size);
446
+ FileStream.close ();
447
+ }
448
+
409
449
std::vector<std::vector<char >> ReadCacheItem (const std::string &FileName) {
410
450
std::vector<std::vector<char >> Res;
411
451
std::ifstream FileStream{FileName, std::ios::binary};
@@ -421,8 +461,8 @@ std::vector<std::vector<char>> ReadCacheItem(const std::string &FileName) {
421
461
for (size_t i = 0 ; i < ImgNum; ++i) {
422
462
FileStream.read ((char *)&ImgSize, sizeof (ImgSize));
423
463
if (DbgProgMgr > 1 ) {
424
- std::cerr << " \t Read " << i << " -th image of size " << std::dec << ImgSize
425
- << " \n " ;
464
+ std::cerr << " #### \t Read " << i << " -th image of size " << std::dec
465
+ << ImgSize << " \n " ;
426
466
}
427
467
428
468
Res[i].resize (ImgSize);
@@ -432,26 +472,88 @@ std::vector<std::vector<char>> ReadCacheItem(const std::string &FileName) {
432
472
return Res;
433
473
}
434
474
435
- std::string getDeviceString (const device &Device) {
436
- return {Device.get_platform ().get_info <sycl::info::platform::name>() +
437
- Device.get_info <sycl::info::device::name>() +
438
- Device.get_info <sycl::info::device::version>() +
439
- Device.get_info <sycl::info::device::driver_version>()};
440
- }
475
+ bool IsCacheItemSrcEqual (const std::string &FileName, const device &Device,
476
+ const RTDeviceBinaryImage &Img,
477
+ const SerializedObj &SpecConsts,
478
+ const std::string &BuildOptionsString) {
479
+ std::ifstream FileStream{FileName, std::ios::binary};
480
+ std::string ImgString{
481
+ DumpBinData (Img.getRawData ().BinaryStart , Img.getSize ())};
482
+ std::string DeviceString{getDeviceString (Device)};
483
+ std::string SpecConstsString{
484
+ DumpBinData (SpecConsts.data (), SpecConsts.size ())};
441
485
442
- std::string DumpBinData (const unsigned char *Data, size_t Size) {
443
- if (!Size)
444
- return " NONE" ;
445
- std::stringstream ss;
446
- for (size_t i = 0 ; i < Size; i++) {
447
- ss << std::hex << (int )Data[i];
486
+ size_t Size;
487
+ std::string res;
488
+
489
+ FileStream.read ((char *)&Size, sizeof (Size));
490
+ res.resize (Size);
491
+ FileStream.read (&res[0 ], Size);
492
+ if (DeviceString.compare (res)) {
493
+ if (DbgProgMgr > 1 ) {
494
+ std::cerr << " ####Devices differ:" <<DeviceString.compare (0 , Size-1 , res.data ())<<" \n " ;
495
+ std::cerr << " ####'" <<DeviceString<<" '\n " ;
496
+ std::cerr << " ####\t vs\n " ;
497
+ std::cerr << " ####'" <<std::string (res.data (),Size)<<" '\n " ;
498
+ std::cerr << " ####Cached size " << std::dec << Size << " vs current size " << DeviceString.size () << std::endl;
499
+ for (unsigned int i=0 ; i< Size;i++){
500
+ if (res[i]!=DeviceString[i])
501
+ std::cerr << " ####First diff on " << i<<std::endl;
502
+ }
503
+ }
504
+
505
+ return false ;
448
506
}
449
- return ss.str ();
507
+
508
+ FileStream.read ((char *)&Size, sizeof (Size));
509
+ res.resize (Size);
510
+ FileStream.read (&res[0 ], Size);
511
+ if (BuildOptionsString.compare (0 , Size, res.data ())) {
512
+ if (DbgProgMgr > 1 ) {
513
+ std::cerr << " ####Build options differ:\n " ;
514
+ std::cerr << " ####'" <<BuildOptionsString<<" '\n " ;
515
+ std::cerr << " ####\t vs\n " ;
516
+ std::cerr << " ####'" <<std::string (res.data (), Size)<<" '\n " ;
517
+ }
518
+ return false ;
519
+ }
520
+
521
+ FileStream.read ((char *)&Size, sizeof (Size));
522
+ res.resize (Size);
523
+ FileStream.read (&res[0 ], Size);
524
+ if (SpecConstsString.compare (0 , Size, res.data ())) {
525
+ if (DbgProgMgr > 1 ) {
526
+ std::cerr << " ####Specialization constants differ\n " ;
527
+ std::cerr << " ####'" <<SpecConstsString<<" '\n " ;
528
+ std::cerr << " ####\t vs\n " ;
529
+ std::cerr << " ####'" <<std::string (res.data (), Size)<<" '\n " ;
530
+ }
531
+ return false ;
532
+ }
533
+
534
+ FileStream.read ((char *)&Size, sizeof (Size));
535
+ res.resize (Size);
536
+ FileStream.read (&res[0 ], Size);
537
+ if (ImgString.compare (0 , Size, res.data ())) {
538
+ if (DbgProgMgr > 1 ) {
539
+ std::cerr << " ####Images differ\n " ;
540
+ std::cerr << " ####'" <<ImgString<<" '\n " ;
541
+ std::cerr << " ####\t vs\n " ;
542
+ std::cerr << " ####'" <<std::string (res.data (), Size)<<" '\n " ;
543
+
544
+ }
545
+ return false ;
546
+ }
547
+
548
+ FileStream.close ();
549
+ if (DbgProgMgr > 1 )
550
+ std::cerr << " ####Cache item sources are equal\n " ;
551
+ return true ;
450
552
}
451
553
452
554
std::string GetCacheItemDirName (const device &Device,
453
555
const RTDeviceBinaryImage &Img,
454
- const SerializedObj SpecConsts,
556
+ const SerializedObj & SpecConsts,
455
557
const std::string &BuildOptionsString) {
456
558
static std::string cache_root{detail::OSUtil::getCacheRoot ()};
457
559
@@ -461,6 +563,7 @@ std::string GetCacheItemDirName(const device &Device,
461
563
std::string SpecConstsString{
462
564
DumpBinData (SpecConsts.data (), SpecConsts.size ())};
463
565
std::hash<std::string> StringHasher{};
566
+
464
567
return {cache_root + " /" + std::to_string (StringHasher (DeviceString)) + " /" +
465
568
std::to_string (StringHasher (ImgString)) + " /" +
466
569
std::to_string (StringHasher (SpecConstsString)) + " /" +
@@ -472,7 +575,7 @@ bool IsPersistentCacheEnabled() {
472
575
SYCLConfig<SYCL_CACHE_DISABLE_PERSISTENT>::get ();
473
576
474
577
if (DbgProgMgr > 0 )
475
- std::cerr << " Persistent cache "
578
+ std::cerr << " #### Persistent cache "
476
579
<< (PersistenCacheDisabled ? " disabled." : " enabled." )
477
580
<< std::endl;
478
581
return !PersistenCacheDisabled;
@@ -481,26 +584,28 @@ bool IsPersistentCacheEnabled() {
481
584
void ProgramManager::putPIProgramToDisc (const detail::plugin &Plugin,
482
585
const device &Device,
483
586
const RTDeviceBinaryImage &Img,
484
- const SerializedObj SpecConsts,
587
+ const SerializedObj & SpecConsts,
485
588
const std::string &BuildOptionsString,
486
589
const RT::PiProgram &Program) {
487
590
if (!IsPersistentCacheEnabled ()) {
488
591
return ;
489
592
}
490
593
491
- static std::string DirName =
594
+ std::string DirName =
492
595
GetCacheItemDirName (Device, Img, SpecConsts, BuildOptionsString);
493
596
494
597
size_t i = 0 ;
495
598
std::string FileName;
496
599
do {
497
- FileName = DirName + " /" + std::to_string (i++) + " .bin" ;
498
- } while (IsFSEntryPresent (FileName.c_str ()));
600
+ FileName = DirName + " /" + std::to_string (i++);
601
+ } while (IsFSEntryPresent (FileName + " .bin" ));
602
+
603
+ unsigned int DeviceNum=0 ;
499
604
500
- size_t DeviceNum;
501
605
Plugin.call <PiApiKind::piProgramGetInfo>(Program, PI_PROGRAM_INFO_NUM_DEVICES,
502
606
sizeof (DeviceNum), &DeviceNum,
503
- nullptr );
607
+ nullptr );
608
+
504
609
std::vector<size_t > BinarySizes (DeviceNum);
505
610
Plugin.call <PiApiKind::piProgramGetInfo>(
506
611
Program, PI_PROGRAM_INFO_BINARY_SIZES,
@@ -518,13 +623,15 @@ void ProgramManager::putPIProgramToDisc(const detail::plugin &Plugin,
518
623
Pointers.data (), nullptr );
519
624
520
625
MakePathRecur (DirName.c_str (), 0777 );
521
- WriteCacheItem (FileName, Result);
626
+ WriteCacheItemBin (FileName + " .bin" , Result);
627
+ WriteCacheItemSrc (FileName + " .src" , Device, Img, SpecConsts,
628
+ BuildOptionsString);
522
629
}
523
630
524
631
bool ProgramManager::getPIProgramFromDisc (ContextImplPtr ContextImpl,
525
632
const device &Device,
526
633
const RTDeviceBinaryImage &Img,
527
- const SerializedObj SpecConsts,
634
+ const SerializedObj & SpecConsts,
528
635
const std::string &BuildOptionsString,
529
636
RT::PiProgram &NativePrg) {
530
637
@@ -538,17 +645,20 @@ bool ProgramManager::getPIProgramFromDisc(ContextImplPtr ContextImpl,
538
645
return false ;
539
646
540
647
int i = 0 ;
541
- std::string BinFileName{Path + " /" + std::to_string (i) + " .bin" };
542
- while (IsFSEntryPresent (BinFileName.c_str ())) {
543
- auto BinDataItem = ReadCacheItem (BinFileName);
544
- if (BinDataItem.size ()) {
648
+ std::string FileName{Path + " /" + std::to_string (i)};
649
+ while (IsFSEntryPresent (FileName + " .bin" ) &&
650
+ IsFSEntryPresent (FileName + " .src" )) {
651
+ auto BinDataItem = ReadCacheItem (FileName + " .bin" );
652
+ if (BinDataItem.size () &&
653
+ IsCacheItemSrcEqual (FileName + " .src" , Device, Img, SpecConsts,
654
+ BuildOptionsString)) {
545
655
// TODO: Build for multiple devices once supported by program manager
546
656
NativePrg = createBinaryProgram (
547
657
ContextImpl, Device, (const unsigned char *)BinDataItem[0 ].data (),
548
658
BinDataItem[0 ].size ());
549
659
return true ;
550
660
}
551
- BinFileName = Path + " /" + std::to_string (++i) + " .bin " ;
661
+ FileName = Path + " /" + std::to_string (++i);
552
662
}
553
663
554
664
return false ;
0 commit comments