summaryrefslogtreecommitdiff
path: root/parallel-libs/streamexecutor/lib/KernelSpec.cpp
blob: d2715aa88a59b22a25044a87f235b88b342bec02 (plain)
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
//===-- KernelSpec.cpp - General kernel spec implementation ---------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains the implementation details for kernel loader specs.
///
//===----------------------------------------------------------------------===//

#include "streamexecutor/KernelSpec.h"

#include "llvm/ADT/STLExtras.h"

namespace streamexecutor {

KernelLoaderSpec::KernelLoaderSpec(llvm::StringRef KernelName)
    : KernelName(KernelName) {}

CUDAPTXInMemorySpec::CUDAPTXInMemorySpec(
    llvm::StringRef KernelName,
    const llvm::ArrayRef<CUDAPTXInMemorySpec::PTXSpec> SpecList)
    : KernelLoaderSpec(KernelName) {
  for (const auto &Spec : SpecList) {
    PTXByComputeCapability.emplace(Spec.TheComputeCapability, Spec.PTXCode);
  }
}

const char *CUDAPTXInMemorySpec::getCode(int ComputeCapabilityMajor,
                                         int ComputeCapabilityMinor) const {
  auto PTXIter =
      PTXByComputeCapability.find(CUDAPTXInMemorySpec::ComputeCapability{
          ComputeCapabilityMajor, ComputeCapabilityMinor});
  if (PTXIter == PTXByComputeCapability.end()) {
    return nullptr;
  }
  return PTXIter->second;
}

CUDAFatbinInMemorySpec::CUDAFatbinInMemorySpec(llvm::StringRef KernelName,
                                               const void *Bytes)
    : KernelLoaderSpec(KernelName), Bytes(Bytes) {}

OpenCLTextInMemorySpec::OpenCLTextInMemorySpec(llvm::StringRef KernelName,
                                               const char *Text)
    : KernelLoaderSpec(KernelName), Text(Text) {}

void MultiKernelLoaderSpec::setKernelName(llvm::StringRef KernelName) {
  if (TheKernelName) {
    assert(KernelName.equals(*TheKernelName) &&
           "different kernel names in one MultiKernelLoaderSpec");
  } else {
    TheKernelName = llvm::make_unique<std::string>(KernelName);
  }
}

MultiKernelLoaderSpec &MultiKernelLoaderSpec::addCUDAPTXInMemory(
    llvm::StringRef KernelName,
    llvm::ArrayRef<CUDAPTXInMemorySpec::PTXSpec> SpecList) {
  assert((TheCUDAPTXInMemorySpec == nullptr) &&
         "illegal loader spec overwrite");
  setKernelName(KernelName);
  TheCUDAPTXInMemorySpec =
      llvm::make_unique<CUDAPTXInMemorySpec>(KernelName, SpecList);
  return *this;
}

MultiKernelLoaderSpec &
MultiKernelLoaderSpec::addCUDAFatbinInMemory(llvm::StringRef KernelName,
                                             const void *Bytes) {
  assert((TheCUDAFatbinInMemorySpec == nullptr) &&
         "illegal loader spec overwrite");
  setKernelName(KernelName);
  TheCUDAFatbinInMemorySpec =
      llvm::make_unique<CUDAFatbinInMemorySpec>(KernelName, Bytes);
  return *this;
}

MultiKernelLoaderSpec &
MultiKernelLoaderSpec::addOpenCLTextInMemory(llvm::StringRef KernelName,
                                             const char *OpenCLText) {
  assert((TheOpenCLTextInMemorySpec == nullptr) &&
         "illegal loader spec overwrite");
  setKernelName(KernelName);
  TheOpenCLTextInMemorySpec =
      llvm::make_unique<OpenCLTextInMemorySpec>(KernelName, OpenCLText);
  return *this;
}

} // namespace streamexecutor