//===-- KernelSpecTest.cpp - Tests for KernelSpec -------------------------===// // // 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 unit tests for the code in KernelSpec. /// //===----------------------------------------------------------------------===// #include "streamexecutor/KernelSpec.h" #include "gtest/gtest.h" namespace { namespace se = ::streamexecutor; TEST(CUDAPTXInMemorySpec, NoCode) { se::CUDAPTXInMemorySpec Spec("KernelName", {}); EXPECT_EQ("KernelName", Spec.getKernelName()); EXPECT_EQ(nullptr, Spec.getCode(1, 0)); } TEST(CUDAPTXInMemorySpec, SingleComputeCapability) { const char *PTXCodeString = "Dummy PTX code"; se::CUDAPTXInMemorySpec Spec("KernelName", {{{1, 0}, PTXCodeString}}); EXPECT_EQ("KernelName", Spec.getKernelName()); EXPECT_EQ(PTXCodeString, Spec.getCode(1, 0)); EXPECT_EQ(nullptr, Spec.getCode(2, 0)); } TEST(CUDAPTXInMemorySpec, TwoComputeCapabilities) { const char *PTXCodeString10 = "Dummy PTX code 10"; const char *PTXCodeString30 = "Dummy PTX code 30"; se::CUDAPTXInMemorySpec Spec( "KernelName", {{{1, 0}, PTXCodeString10}, {{3, 0}, PTXCodeString30}}); EXPECT_EQ("KernelName", Spec.getKernelName()); EXPECT_EQ(PTXCodeString10, Spec.getCode(1, 0)); EXPECT_EQ(PTXCodeString30, Spec.getCode(3, 0)); EXPECT_EQ(nullptr, Spec.getCode(2, 0)); } TEST(CUDAFatbinInMemorySpec, BasicUsage) { const char *FatbinBytes = "Dummy fatbin bytes"; se::CUDAFatbinInMemorySpec Spec("KernelName", FatbinBytes); EXPECT_EQ("KernelName", Spec.getKernelName()); EXPECT_EQ(FatbinBytes, Spec.getBytes()); } TEST(OpenCLTextInMemorySpec, BasicUsage) { const char *OpenCLText = "Dummy OpenCL text"; se::OpenCLTextInMemorySpec Spec("KernelName", OpenCLText); EXPECT_EQ("KernelName", Spec.getKernelName()); EXPECT_EQ(OpenCLText, Spec.getText()); } TEST(MultiKernelLoaderSpec, NoCode) { se::MultiKernelLoaderSpec MultiSpec; EXPECT_FALSE(MultiSpec.hasCUDAPTXInMemory()); EXPECT_FALSE(MultiSpec.hasCUDAFatbinInMemory()); EXPECT_FALSE(MultiSpec.hasOpenCLTextInMemory()); EXPECT_DEBUG_DEATH(MultiSpec.getCUDAPTXInMemory(), "getting spec that is not present"); EXPECT_DEBUG_DEATH(MultiSpec.getCUDAFatbinInMemory(), "getting spec that is not present"); EXPECT_DEBUG_DEATH(MultiSpec.getOpenCLTextInMemory(), "getting spec that is not present"); } TEST(MultiKernelLoaderSpec, Registration) { se::MultiKernelLoaderSpec MultiSpec; const char *KernelName = "KernelName"; const char *PTXCodeString = "Dummy PTX code"; const char *FatbinBytes = "Dummy fatbin bytes"; const char *OpenCLText = "Dummy OpenCL text"; MultiSpec.addCUDAPTXInMemory(KernelName, {{{1, 0}, PTXCodeString}}) .addCUDAFatbinInMemory(KernelName, FatbinBytes) .addOpenCLTextInMemory(KernelName, OpenCLText); EXPECT_TRUE(MultiSpec.hasCUDAPTXInMemory()); EXPECT_TRUE(MultiSpec.hasCUDAFatbinInMemory()); EXPECT_TRUE(MultiSpec.hasOpenCLTextInMemory()); EXPECT_EQ(KernelName, MultiSpec.getCUDAPTXInMemory().getKernelName()); EXPECT_EQ(PTXCodeString, MultiSpec.getCUDAPTXInMemory().getCode(1, 0)); EXPECT_EQ(nullptr, MultiSpec.getCUDAPTXInMemory().getCode(2, 0)); EXPECT_EQ(KernelName, MultiSpec.getCUDAFatbinInMemory().getKernelName()); EXPECT_EQ(FatbinBytes, MultiSpec.getCUDAFatbinInMemory().getBytes()); EXPECT_EQ(KernelName, MultiSpec.getOpenCLTextInMemory().getKernelName()); EXPECT_EQ(OpenCLText, MultiSpec.getOpenCLTextInMemory().getText()); } TEST(MultiKernelLoaderSpec, RegisterTwice) { se::MultiKernelLoaderSpec MultiSpec; const char *KernelName = "KernelName"; const char *FatbinBytes = "Dummy fatbin bytes"; MultiSpec.addCUDAFatbinInMemory(KernelName, FatbinBytes); EXPECT_DEBUG_DEATH(MultiSpec.addCUDAFatbinInMemory(KernelName, FatbinBytes), "illegal loader spec overwrite"); } TEST(MultiKernelLoaderSpec, ConflictingKernelNames) { se::MultiKernelLoaderSpec MultiSpec; const char *KernelNameA = "KernelName"; std::string KernelNameB = KernelNameA; const char *PTXCodeString = "Dummy PTX code"; const char *FatbinBytes = "Dummy fatbin bytes"; // Check that names don't conflict if they are equivalent strings in different // locations. MultiSpec.addCUDAPTXInMemory(KernelNameA, {{{1, 0}, PTXCodeString}}) .addCUDAFatbinInMemory(KernelNameB, FatbinBytes); const char *OtherKernelName = "OtherKernelName"; const char *OpenCLText = "Dummy OpenCL text"; EXPECT_DEBUG_DEATH( MultiSpec.addOpenCLTextInMemory(OtherKernelName, OpenCLText), "different kernel names in one MultiKernelLoaderSpec"); } } // namespace