Working implementation with tests
This commit is contained in:
parent
cf7d46cd23
commit
f02b9d6915
21 changed files with 297 additions and 216 deletions
|
|
@ -14,9 +14,9 @@ int main()
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
auto tensorInA = mgr.tensor<float>({ 2.0, 4.0, 6.0 });
|
||||
auto tensorInB = mgr.tensor<float>({ 0.0, 1.0, 2.0 });
|
||||
auto tensorOut = mgr.tensor<float>({ 0.0, 0.0, 0.0 });
|
||||
auto tensorInA = mgr.tensor({ 2.0, 4.0, 6.0 });
|
||||
auto tensorInB = mgr.tensor({ 0.0, 1.0, 2.0 });
|
||||
auto tensorOut = mgr.tensor({ 0.0, 0.0, 0.0 });
|
||||
|
||||
std::string shader(R"(
|
||||
// The version to use
|
||||
|
|
@ -49,7 +49,7 @@ int main()
|
|||
|
||||
// prints "Output { 0 4 12 }"
|
||||
std::cout<< "Output: { ";
|
||||
for (const float& elem : tensorOut->data()) {
|
||||
for (const float& elem : tensorOut->vector()) {
|
||||
std::cout << elem << " ";
|
||||
}
|
||||
std::cout << "}" << std::endl;
|
||||
|
|
|
|||
|
|
@ -17,19 +17,19 @@ int main()
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
auto xI = mgr.tensor<float>({ 0, 1, 1, 1, 1 });
|
||||
auto xJ = mgr.tensor<float>({ 0, 0, 0, 1, 1 });
|
||||
auto xI = mgr.tensor({ 0, 1, 1, 1, 1 });
|
||||
auto xJ = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
auto y = mgr.tensor<float>({ 0, 0, 0, 1, 1 });
|
||||
auto y = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
auto wIn = mgr.tensor<float>({ 0.001, 0.001 });
|
||||
auto wOutI = mgr.tensor<float>({ 0, 0, 0, 0, 0 });
|
||||
auto wOutJ = mgr.tensor<float>({ 0, 0, 0, 0, 0 });
|
||||
auto wIn = mgr.tensor({ 0.001, 0.001 });
|
||||
auto wOutI = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
auto wOutJ = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
auto bIn = mgr.tensor<float>({ 0 });
|
||||
auto bOut = mgr.tensor<float>({ 0, 0, 0, 0, 0 });
|
||||
auto bIn = mgr.tensor({ 0 });
|
||||
auto bOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
auto lOut = mgr.tensor<float>({ 0, 0, 0, 0, 0 });
|
||||
auto lOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { xI, xJ, y,
|
||||
wIn, wOutI, wOutJ,
|
||||
|
|
@ -40,7 +40,8 @@ int main()
|
|||
(uint32_t*)(kp::shader_data::shaders_glsl_logisticregression_comp_spv
|
||||
+ kp::shader_data::shaders_glsl_logisticregression_comp_spv_len));
|
||||
|
||||
std::shared_ptr<kp::Algorithm> algo = mgr.algorithm(params, spirv);
|
||||
std::shared_ptr<kp::Algorithm> algo = mgr.algorithm(
|
||||
params, spirv, kp::Workgroup({ 5 }), kp::Constants({ 5.0 }));
|
||||
|
||||
mgr.sequence()->eval<kp::OpTensorSyncDevice>(params);
|
||||
|
||||
|
|
|
|||
|
|
@ -974,11 +974,21 @@ class Tensor
|
|||
return this->mDataType;
|
||||
}
|
||||
|
||||
// TODO: move to cpp
|
||||
const void* getRawData() {
|
||||
void* rawData() {
|
||||
return this->mRawData;
|
||||
}
|
||||
|
||||
// TODO: move to cpp
|
||||
template <typename T>
|
||||
T* data() {
|
||||
return this->mRawData;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::vector<T> vector() {
|
||||
return { (T*)this->mRawData, ((T*)this->mRawData) + this->size() };
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets / resets the vector data of the tensor. This function does not
|
||||
* perform any copies into GPU memory and is only performed on the host.
|
||||
|
|
@ -989,6 +999,14 @@ class Tensor
|
|||
memcpy(this->mRawData, data, this->memorySize());
|
||||
}
|
||||
|
||||
protected:
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
TensorTypes mTensorType;
|
||||
TensorDataTypes mDataType;
|
||||
uint32_t mSize;
|
||||
uint32_t mDataTypeMemorySize;
|
||||
void* mRawData;
|
||||
|
||||
private:
|
||||
void rawMapData() {
|
||||
|
||||
|
|
@ -1027,13 +1045,6 @@ class Tensor
|
|||
std::shared_ptr<vk::DeviceMemory> mStagingMemory;
|
||||
bool mFreeStagingMemory = false;
|
||||
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
TensorTypes mTensorType;
|
||||
TensorDataTypes mDataType;
|
||||
uint32_t mSize;
|
||||
uint32_t mDataTypeMemorySize;
|
||||
void* mRawData;
|
||||
|
||||
void allocateMemoryCreateGPUResources(); // Creates the vulkan buffer
|
||||
void createBuffer(std::shared_ptr<vk::Buffer> buffer,
|
||||
vk::BufferUsageFlags bufferUsageFlags);
|
||||
|
|
@ -1057,10 +1068,11 @@ class Tensor
|
|||
|
||||
// TODO: Limit T to be only float, bool, double, etc
|
||||
template <typename T>
|
||||
class TensorView: public Tensor
|
||||
class TensorT: public Tensor
|
||||
{
|
||||
|
||||
public:
|
||||
TensorView(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
|
||||
TensorT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
|
||||
std::shared_ptr<vk::Device> device,
|
||||
const std::vector<T>& data,
|
||||
const TensorTypes& tensorType = TensorTypes::eDevice)
|
||||
|
|
@ -1069,35 +1081,42 @@ class TensorView: public Tensor
|
|||
(void*)data.data(),
|
||||
data.size(),
|
||||
sizeof(T),
|
||||
this->dataType())
|
||||
this->dataType(),
|
||||
tensorType)
|
||||
{
|
||||
KP_LOG_DEBUG("Kompute TensorView constructor with data size {}", data.size());
|
||||
KP_LOG_DEBUG("Kompute TensorT constructor with data size {}", data.size());
|
||||
}
|
||||
|
||||
~TensorView() {
|
||||
KP_LOG_DEBUG("Kompute TensorView destructor");
|
||||
~TensorT() {
|
||||
KP_LOG_DEBUG("Kompute TensorT destructor");
|
||||
}
|
||||
|
||||
std::vector<T> data() {
|
||||
return { (T*)this->getRawData(), ((T*)this->getRawData()) + this->size() };
|
||||
T* data() {
|
||||
return (T*)this->mRawData;
|
||||
}
|
||||
|
||||
std::vector<T> vector() {
|
||||
return { (T*)this->mRawData, ((T*)this->mRawData) + this->size() };
|
||||
}
|
||||
|
||||
T& operator[](int index) {
|
||||
return ((T*)this->mRawData)[index];
|
||||
return *(((T*)this->mRawData) + index);
|
||||
}
|
||||
|
||||
void setData(const std::vector<T>& data) {
|
||||
|
||||
KP_LOG_DEBUG("Kompute TensorView setting data with data size {}", data.size());
|
||||
KP_LOG_DEBUG("Kompute TensorT setting data with data size {}", data.size());
|
||||
|
||||
if (data.size() != this->mSize) {
|
||||
throw std::runtime_error(
|
||||
"Kompute TensorView Cannot set data of different sizes");
|
||||
"Kompute TensorT Cannot set data of different sizes");
|
||||
}
|
||||
|
||||
Tensor::setRawData(this->mData.data(), this->mData.size(), sizeof(T));
|
||||
Tensor::setRawData(data.data());
|
||||
}
|
||||
|
||||
TensorDataTypes dataType();
|
||||
|
||||
};
|
||||
|
||||
} // End namespace kp
|
||||
|
|
@ -1969,13 +1988,13 @@ class Manager
|
|||
* @returns Shared pointer with initialised tensor
|
||||
*/
|
||||
template <typename T>
|
||||
std::shared_ptr<TensorView<T>> tensor(
|
||||
std::shared_ptr<TensorT<T>> tensorT(
|
||||
const std::vector<T>& data,
|
||||
Tensor::TensorTypes tensorType = Tensor::TensorTypes::eDevice)
|
||||
{
|
||||
KP_LOG_DEBUG("Kompute Manager tensor creation triggered");
|
||||
|
||||
std::shared_ptr<TensorView<T>> tensor{ new kp::TensorView<T>(
|
||||
std::shared_ptr<TensorT<T>> tensor{ new kp::TensorT<T>(
|
||||
this->mPhysicalDevice, this->mDevice, data, tensorType) };
|
||||
|
||||
if (this->mManageResources) {
|
||||
|
|
@ -1985,6 +2004,13 @@ class Manager
|
|||
return tensor;
|
||||
}
|
||||
|
||||
std::shared_ptr<TensorT<float>> tensor(
|
||||
const std::vector<float>& data,
|
||||
Tensor::TensorTypes tensorType = Tensor::TensorTypes::eDevice)
|
||||
{
|
||||
return this->tensorT<float>(data, tensorType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a managed algorithm that will be destroyed by this manager
|
||||
* if it hasn't been destroyed by its reference count going to zero.
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ OpTensorCopy::postEval(const vk::CommandBuffer& commandBuffer)
|
|||
uint32_t size = this->mTensors[0]->size();
|
||||
uint32_t dataTypeMemSize = this->mTensors[0]->dataTypeMemorySize();
|
||||
uint32_t memSize = size * dataTypeMemSize;
|
||||
const void* data = this->mTensors[0]->getRawData();
|
||||
void* data = this->mTensors[0]->rawData();
|
||||
|
||||
// Copy the data from the first tensor into all the tensors
|
||||
for (size_t i = 1; i < this->mTensors.size(); i++) {
|
||||
|
|
|
|||
|
|
@ -429,4 +429,34 @@ Tensor::destroy()
|
|||
KP_LOG_DEBUG("Kompute Tensor successful destroy()");
|
||||
}
|
||||
|
||||
template<>
|
||||
Tensor::TensorDataTypes
|
||||
TensorT<bool>::dataType() {
|
||||
return Tensor::TensorDataTypes::eBool;
|
||||
}
|
||||
|
||||
template<>
|
||||
Tensor::TensorDataTypes
|
||||
TensorT<int32_t>::dataType() {
|
||||
return Tensor::TensorDataTypes::eInt;
|
||||
}
|
||||
|
||||
template<>
|
||||
Tensor::TensorDataTypes
|
||||
TensorT<uint32_t>::dataType() {
|
||||
return Tensor::TensorDataTypes::eUnsignedInt;
|
||||
}
|
||||
|
||||
template<>
|
||||
Tensor::TensorDataTypes
|
||||
TensorT<float>::dataType() {
|
||||
return Tensor::TensorDataTypes::eFloat;
|
||||
}
|
||||
|
||||
template<>
|
||||
Tensor::TensorDataTypes
|
||||
TensorT<double>::dataType() {
|
||||
return Tensor::TensorDataTypes::eDouble;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,13 +75,13 @@ class Manager
|
|||
* @returns Shared pointer with initialised tensor
|
||||
*/
|
||||
template <typename T>
|
||||
std::shared_ptr<TensorView<T>> tensor(
|
||||
std::shared_ptr<TensorT<T>> tensorT(
|
||||
const std::vector<T>& data,
|
||||
Tensor::TensorTypes tensorType = Tensor::TensorTypes::eDevice)
|
||||
{
|
||||
KP_LOG_DEBUG("Kompute Manager tensor creation triggered");
|
||||
|
||||
std::shared_ptr<TensorView<T>> tensor{ new kp::TensorView<T>(
|
||||
std::shared_ptr<TensorT<T>> tensor{ new kp::TensorT<T>(
|
||||
this->mPhysicalDevice, this->mDevice, data, tensorType) };
|
||||
|
||||
if (this->mManageResources) {
|
||||
|
|
@ -91,6 +91,13 @@ class Manager
|
|||
return tensor;
|
||||
}
|
||||
|
||||
std::shared_ptr<TensorT<float>> tensor(
|
||||
const std::vector<float>& data,
|
||||
Tensor::TensorTypes tensorType = Tensor::TensorTypes::eDevice)
|
||||
{
|
||||
return this->tensorT<float>(data, tensorType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a managed algorithm that will be destroyed by this manager
|
||||
* if it hasn't been destroyed by its reference count going to zero.
|
||||
|
|
|
|||
|
|
@ -183,11 +183,21 @@ class Tensor
|
|||
return this->mDataType;
|
||||
}
|
||||
|
||||
// TODO: move to cpp
|
||||
const void* getRawData() {
|
||||
void* rawData() {
|
||||
return this->mRawData;
|
||||
}
|
||||
|
||||
// TODO: move to cpp
|
||||
template <typename T>
|
||||
T* data() {
|
||||
return this->mRawData;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::vector<T> vector() {
|
||||
return { (T*)this->mRawData, ((T*)this->mRawData) + this->size() };
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets / resets the vector data of the tensor. This function does not
|
||||
* perform any copies into GPU memory and is only performed on the host.
|
||||
|
|
@ -198,6 +208,14 @@ class Tensor
|
|||
memcpy(this->mRawData, data, this->memorySize());
|
||||
}
|
||||
|
||||
protected:
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
TensorTypes mTensorType;
|
||||
TensorDataTypes mDataType;
|
||||
uint32_t mSize;
|
||||
uint32_t mDataTypeMemorySize;
|
||||
void* mRawData;
|
||||
|
||||
private:
|
||||
void rawMapData() {
|
||||
|
||||
|
|
@ -236,13 +254,6 @@ class Tensor
|
|||
std::shared_ptr<vk::DeviceMemory> mStagingMemory;
|
||||
bool mFreeStagingMemory = false;
|
||||
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
TensorTypes mTensorType;
|
||||
TensorDataTypes mDataType;
|
||||
uint32_t mSize;
|
||||
uint32_t mDataTypeMemorySize;
|
||||
void* mRawData;
|
||||
|
||||
void allocateMemoryCreateGPUResources(); // Creates the vulkan buffer
|
||||
void createBuffer(std::shared_ptr<vk::Buffer> buffer,
|
||||
vk::BufferUsageFlags bufferUsageFlags);
|
||||
|
|
@ -266,10 +277,11 @@ class Tensor
|
|||
|
||||
// TODO: Limit T to be only float, bool, double, etc
|
||||
template <typename T>
|
||||
class TensorView: public Tensor
|
||||
class TensorT: public Tensor
|
||||
{
|
||||
|
||||
public:
|
||||
TensorView(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
|
||||
TensorT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
|
||||
std::shared_ptr<vk::Device> device,
|
||||
const std::vector<T>& data,
|
||||
const TensorTypes& tensorType = TensorTypes::eDevice)
|
||||
|
|
@ -278,35 +290,42 @@ class TensorView: public Tensor
|
|||
(void*)data.data(),
|
||||
data.size(),
|
||||
sizeof(T),
|
||||
this->dataType())
|
||||
this->dataType(),
|
||||
tensorType)
|
||||
{
|
||||
KP_LOG_DEBUG("Kompute TensorView constructor with data size {}", data.size());
|
||||
KP_LOG_DEBUG("Kompute TensorT constructor with data size {}", data.size());
|
||||
}
|
||||
|
||||
~TensorView() {
|
||||
KP_LOG_DEBUG("Kompute TensorView destructor");
|
||||
~TensorT() {
|
||||
KP_LOG_DEBUG("Kompute TensorT destructor");
|
||||
}
|
||||
|
||||
std::vector<T> data() {
|
||||
return { (T*)this->getRawData(), ((T*)this->getRawData()) + this->size() };
|
||||
T* data() {
|
||||
return (T*)this->mRawData;
|
||||
}
|
||||
|
||||
std::vector<T> vector() {
|
||||
return { (T*)this->mRawData, ((T*)this->mRawData) + this->size() };
|
||||
}
|
||||
|
||||
T& operator[](int index) {
|
||||
return ((T*)this->mRawData)[index];
|
||||
return *(((T*)this->mRawData) + index);
|
||||
}
|
||||
|
||||
void setData(const std::vector<T>& data) {
|
||||
|
||||
KP_LOG_DEBUG("Kompute TensorView setting data with data size {}", data.size());
|
||||
KP_LOG_DEBUG("Kompute TensorT setting data with data size {}", data.size());
|
||||
|
||||
if (data.size() != this->mSize) {
|
||||
throw std::runtime_error(
|
||||
"Kompute TensorView Cannot set data of different sizes");
|
||||
"Kompute TensorT Cannot set data of different sizes");
|
||||
}
|
||||
|
||||
Tensor::setRawData(this->mData.data(), this->mData.size(), sizeof(T));
|
||||
Tensor::setRawData(data.data());
|
||||
}
|
||||
|
||||
TensorDataTypes dataType();
|
||||
|
||||
};
|
||||
|
||||
} // End namespace kp
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution)
|
|||
sq->eval<kp::OpTensorSyncLocal>(inputsSyncB);
|
||||
|
||||
for (uint32_t i = 0; i < numParallel; i++) {
|
||||
EXPECT_EQ(inputsSyncB[i]->data(), resultSync);
|
||||
EXPECT_EQ(inputsSyncB[i]->vector<float>(), resultSync);
|
||||
}
|
||||
|
||||
kp::Manager mgrAsync(0, { 0, 2 });
|
||||
|
|
@ -111,7 +111,7 @@ TEST(TestAsyncOperations, TestManagerParallelExecution)
|
|||
sq->eval<kp::OpTensorSyncLocal>({ inputsAsyncB });
|
||||
|
||||
for (uint32_t i = 0; i < numParallel; i++) {
|
||||
EXPECT_EQ(inputsAsyncB[i]->data(), resultAsync);
|
||||
EXPECT_EQ((inputsAsyncB[i]->vector<float>()), resultAsync);
|
||||
}
|
||||
|
||||
// The speedup should be at least 40%
|
||||
|
|
@ -152,8 +152,8 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution)
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(data);
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor(data);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(data);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor(data);
|
||||
|
||||
std::shared_ptr<kp::Sequence> sq1 = mgr.sequence();
|
||||
std::shared_ptr<kp::Sequence> sq2 = mgr.sequence();
|
||||
|
|
@ -172,6 +172,6 @@ TEST(TestAsyncOperations, TestManagerAsyncExecution)
|
|||
sq1->evalAsync<kp::OpTensorSyncLocal>({ tensorA, tensorB });
|
||||
sq1->evalAwait();
|
||||
|
||||
EXPECT_EQ(tensorA->data(), resultAsync);
|
||||
EXPECT_EQ(tensorB->data(), resultAsync);
|
||||
EXPECT_EQ(tensorA->vector(), resultAsync);
|
||||
EXPECT_EQ(tensorB->vector(), resultAsync);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@
|
|||
|
||||
TEST(TestDestroy, TestDestroyTensorSingle)
|
||||
{
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
|
||||
std::string shader(R"(
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
layout (local_size_x = 1) in;
|
||||
layout(set = 0, binding = 0) buffer a { float pa[]; };
|
||||
|
|
@ -39,13 +39,13 @@ TEST(TestDestroy, TestDestroyTensorSingle)
|
|||
}
|
||||
EXPECT_FALSE(tensorA->isInit());
|
||||
}
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 1, 1, 1 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 1, 1, 1 }));
|
||||
}
|
||||
|
||||
TEST(TestDestroy, TestDestroyTensorVector)
|
||||
{
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::Tensor> tensorB = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = nullptr;
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -84,13 +84,13 @@ TEST(TestDestroy, TestDestroyTensorVector)
|
|||
EXPECT_FALSE(tensorB->isInit());
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 2, 2, 2 }));
|
||||
EXPECT_EQ(tensorB->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 2, 2, 2 }));
|
||||
EXPECT_EQ(tensorB->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
||||
TEST(TestDestroy, TestDestroySequenceSingle)
|
||||
{
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -123,5 +123,5 @@ TEST(TestDestroy, TestDestroySequenceSingle)
|
|||
EXPECT_FALSE(sq->isInit());
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 1, 1, 1 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 1, 1, 1 }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,19 +14,19 @@ TEST(TestLogisticRegression, TestMainLogisticRegression)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> xI = mgr.tensor({ 0, 1, 1, 1, 1 });
|
||||
std::shared_ptr<kp::Tensor> xJ = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> xI = mgr.tensor({ 0, 1, 1, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> xJ = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> y = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> y = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> wIn = mgr.tensor({ 0.001, 0.001 });
|
||||
std::shared_ptr<kp::Tensor> wOutI = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::Tensor> wOutJ = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> wIn = mgr.tensor({ 0.001, 0.001 });
|
||||
std::shared_ptr<kp::TensorT<float>> wOutI = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> wOutJ = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> bIn = mgr.tensor({ 0 });
|
||||
std::shared_ptr<kp::Tensor> bOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> bIn = mgr.tensor({ 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> bOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> lOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> lOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { xI, xJ, y,
|
||||
wIn, wOutI, wOutJ,
|
||||
|
|
@ -88,21 +88,21 @@ TEST(TestLogisticRegression, TestMainLogisticRegressionManualCopy)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> xI = mgr.tensor({ 0, 1, 1, 1, 1 });
|
||||
std::shared_ptr<kp::Tensor> xJ = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> xI = mgr.tensor({ 0, 1, 1, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> xJ = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> y = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
std::shared_ptr<kp::TensorT<float>> y = mgr.tensor({ 0, 0, 0, 1, 1 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> wIn =
|
||||
std::shared_ptr<kp::TensorT<float>> wIn =
|
||||
mgr.tensor({ 0.001, 0.001 }, kp::Tensor::TensorTypes::eHost);
|
||||
std::shared_ptr<kp::Tensor> wOutI = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::Tensor> wOutJ = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> wOutI = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> wOutJ = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> bIn =
|
||||
std::shared_ptr<kp::TensorT<float>> bIn =
|
||||
mgr.tensor({ 0 }, kp::Tensor::TensorTypes::eHost);
|
||||
std::shared_ptr<kp::Tensor> bOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> bOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Tensor> lOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> lOut = mgr.tensor({ 0, 0, 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { xI, xJ, y,
|
||||
wIn, wOutI, wOutJ,
|
||||
|
|
@ -136,8 +136,6 @@ TEST(TestLogisticRegression, TestMainLogisticRegressionManualCopy)
|
|||
wIn->data()[1] -= learningRate * wOutJ->data()[j];
|
||||
bIn->data()[0] -= learningRate * bOut->data()[j];
|
||||
}
|
||||
wIn->mapDataIntoHostMemory();
|
||||
bIn->mapDataIntoHostMemory();
|
||||
}
|
||||
|
||||
// Based on the inputs the outputs should be at least:
|
||||
|
|
|
|||
|
|
@ -7,9 +7,9 @@ TEST(TestManager, EndToEndOpMultEvalFlow)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::Tensor> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::Tensor> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { tensorLHS,
|
||||
tensorRHS,
|
||||
|
|
@ -20,16 +20,16 @@ TEST(TestManager, EndToEndOpMultEvalFlow)
|
|||
->eval<kp::OpMult>(params, mgr.algorithm())
|
||||
->eval<kp::OpTensorSyncLocal>(params);
|
||||
|
||||
EXPECT_EQ(tensorOutput->data(), std::vector<float>({ 0, 4, 12 }));
|
||||
EXPECT_EQ(tensorOutput->vector(), std::vector<float>({ 0, 4, 12 }));
|
||||
}
|
||||
|
||||
TEST(TestManager, EndToEndOpMultSeqFlow)
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::Tensor> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::Tensor> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { tensorLHS,
|
||||
tensorRHS,
|
||||
|
|
@ -41,16 +41,16 @@ TEST(TestManager, EndToEndOpMultSeqFlow)
|
|||
->record<kp::OpTensorSyncLocal>(params)
|
||||
->eval();
|
||||
|
||||
EXPECT_EQ(tensorOutput->data(), std::vector<float>({ 0, 4, 12 }));
|
||||
EXPECT_EQ(tensorOutput->vector(), std::vector<float>({ 0, 4, 12 }));
|
||||
}
|
||||
|
||||
TEST(TestManager, TestMultipleSequences)
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::Tensor> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::Tensor> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorLHS = mgr.tensor({ 0, 1, 2 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorRHS = mgr.tensor({ 2, 4, 6 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorOutput = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { tensorLHS,
|
||||
tensorRHS,
|
||||
|
|
@ -60,5 +60,5 @@ TEST(TestManager, TestMultipleSequences)
|
|||
mgr.sequence()->eval<kp::OpMult>(params, mgr.algorithm());
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>(params);
|
||||
|
||||
EXPECT_EQ(tensorOutput->data(), std::vector<float>({ 0, 4, 12 }));
|
||||
EXPECT_EQ(tensorOutput->vector(), std::vector<float>({ 0, 4, 12 }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,8 +64,8 @@ TEST(TestMultipleAlgoExecutions, TestEndToEndFunctionality)
|
|||
|
||||
sq->evalAwait();
|
||||
|
||||
EXPECT_EQ(tensorOutA->data(), std::vector<float>({ 4, 8, 12 }));
|
||||
EXPECT_EQ(tensorOutB->data(), std::vector<float>({ 10, 10, 10 }));
|
||||
EXPECT_EQ(tensorOutA->vector(), std::vector<float>({ 4, 8, 12 }));
|
||||
EXPECT_EQ(tensorOutB->vector(), std::vector<float>({ 10, 10, 10 }));
|
||||
}
|
||||
|
||||
TEST(TestMultipleAlgoExecutions, SingleSequenceRecord)
|
||||
|
|
@ -73,7 +73,7 @@ TEST(TestMultipleAlgoExecutions, SingleSequenceRecord)
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -96,14 +96,14 @@ TEST(TestMultipleAlgoExecutions, SingleSequenceRecord)
|
|||
->eval();
|
||||
}
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
||||
TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords)
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -131,7 +131,7 @@ TEST(TestMultipleAlgoExecutions, MultipleCmdBufRecords)
|
|||
|
||||
mgr.sequence()->record<kp::OpTensorSyncLocal>({ tensorA })->eval();
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
||||
TEST(TestMultipleAlgoExecutions, MultipleSequences)
|
||||
|
|
@ -139,7 +139,7 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences)
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -167,14 +167,14 @@ TEST(TestMultipleAlgoExecutions, MultipleSequences)
|
|||
|
||||
sq->record<kp::OpTensorSyncLocal>({ tensorA })->eval();
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
||||
TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval)
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -198,12 +198,12 @@ TEST(TestMultipleAlgoExecutions, SingleRecordMultipleEval)
|
|||
|
||||
sq->record<kp::OpTensorSyncLocal>({ tensorA })->eval();
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
||||
TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope)
|
||||
{
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
|
||||
{
|
||||
std::shared_ptr<kp::Sequence> sq = nullptr;
|
||||
|
|
@ -236,5 +236,5 @@ TEST(TestMultipleAlgoExecutions, SequenceAlgoDestroyOutsideManagerScope)
|
|||
}
|
||||
}
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 3, 3, 3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 3, 3, 3 }));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ TEST(TestOpAlgoCreate, ShaderRawDataFromConstructor)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 3, 4, 5 });
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 3, 4, 5 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::string shader(R"(
|
||||
#version 450
|
||||
|
|
@ -36,16 +36,16 @@ TEST(TestOpAlgoCreate, ShaderRawDataFromConstructor)
|
|||
->eval<kp::OpAlgoDispatch>(mgr.algorithm(params, spirv))
|
||||
->eval<kp::OpTensorSyncLocal>(params);
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 0, 1, 2 }));
|
||||
EXPECT_EQ(tensorB->data(), std::vector<float>({ 3, 4, 5 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 0, 1, 2 }));
|
||||
EXPECT_EQ(tensorB->vector(), std::vector<float>({ 3, 4, 5 }));
|
||||
}
|
||||
|
||||
TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor)
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 3, 4, 5 });
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 3, 4, 5 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::vector<uint32_t> spirv = std::vector<uint32_t>(
|
||||
(uint32_t*)
|
||||
|
|
@ -62,8 +62,8 @@ TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor)
|
|||
->eval<kp::OpAlgoDispatch>(mgr.algorithm(params, spirv))
|
||||
->eval<kp::OpTensorSyncLocal>(params);
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 0, 1, 2 }));
|
||||
EXPECT_EQ(tensorB->data(), std::vector<float>({ 3, 4, 5 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 0, 1, 2 }));
|
||||
EXPECT_EQ(tensorB->vector(), std::vector<float>({ 3, 4, 5 }));
|
||||
}
|
||||
|
||||
// TODO: Add support to read from file for shader
|
||||
|
|
@ -71,8 +71,8 @@ TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor)
|
|||
//{
|
||||
// kp::Manager mgr;
|
||||
//
|
||||
// std::shared_ptr<kp::Tensor> tensorA{ new kp::Tensor({ 3, 4, 5 }) };
|
||||
// std::shared_ptr<kp::Tensor> tensorB{ new kp::Tensor({ 0, 0, 0 }) };
|
||||
// std::shared_ptr<kp::TensorT<float>> tensorA{ new kp::Tensor({ 3, 4, 5 }) };
|
||||
// std::shared_ptr<kp::TensorT<float>> tensorB{ new kp::Tensor({ 0, 0, 0 }) };
|
||||
// mgr.rebuild({ tensorA, tensorB });
|
||||
//
|
||||
// mgr.evalOpDefault<kp::OpAlgoCreate>(
|
||||
|
|
@ -81,6 +81,6 @@ TEST(TestOpAlgoCreate, ShaderCompiledDataFromConstructor)
|
|||
//
|
||||
// mgr.evalOpDefault<kp::OpTensorSyncLocal>({ tensorA, tensorB });
|
||||
//
|
||||
// EXPECT_EQ(tensorA->data(), std::vector<float>({ 0, 1, 2 }));
|
||||
// EXPECT_EQ(tensorB->data(), std::vector<float>({ 3, 4, 5 }));
|
||||
// EXPECT_EQ(tensorA->vector(), std::vector<float>({ 0, 1, 2 }));
|
||||
// EXPECT_EQ(tensorB->vector(), std::vector<float>({ 3, 4, 5 }));
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor)
|
|||
std::vector<float> testVecA{ 1, 2, 3 };
|
||||
std::vector<float> testVecB{ 0, 0, 0 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor(testVecB);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor(testVecB);
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
EXPECT_TRUE(tensorB->isInit());
|
||||
|
|
@ -22,8 +22,8 @@ TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor)
|
|||
->eval<kp::OpTensorCopy>({ tensorA, tensorB })
|
||||
->eval<kp::OpTensorSyncLocal>({ tensorA, tensorB });
|
||||
|
||||
// Making sure the GPU holds the same data
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
// Making sure the GPU holds the same vector
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
}
|
||||
|
||||
TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti)
|
||||
|
|
@ -35,9 +35,9 @@ TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti)
|
|||
std::vector<float> testVecB{ 0, 0, 0 };
|
||||
std::vector<float> testVecC{ 0, 0, 0 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor(testVecB);
|
||||
std::shared_ptr<kp::Tensor> tensorC = mgr.tensor(testVecC);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor(testVecB);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorC = mgr.tensor(testVecC);
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
EXPECT_TRUE(tensorB->isInit());
|
||||
|
|
@ -47,14 +47,14 @@ TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti)
|
|||
->eval<kp::OpTensorSyncLocal>({ tensorA, tensorB, tensorC })
|
||||
->eval<kp::OpTensorCopy>({ tensorA, tensorB, tensorC });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->data(), tensorC->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
EXPECT_EQ(tensorA->vector(), tensorC->vector());
|
||||
|
||||
// Making sure the GPU holds the same data
|
||||
// Making sure the GPU holds the same vector
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorB, tensorC });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->data(), tensorC->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
EXPECT_EQ(tensorA->vector(), tensorC->vector());
|
||||
}
|
||||
|
||||
TEST(TestOpTensorCopy, CopyDeviceToHostTensor)
|
||||
|
|
@ -65,8 +65,8 @@ TEST(TestOpTensorCopy, CopyDeviceToHostTensor)
|
|||
std::vector<float> testVecA{ 3, 4, 5 };
|
||||
std::vector<float> testVecB{ 0, 0, 0 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::Tensor> tensorB =
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB =
|
||||
mgr.tensor(testVecB, kp::Tensor::TensorTypes::eHost);
|
||||
|
||||
// Only calling sync on device type tensor
|
||||
|
|
@ -77,11 +77,11 @@ TEST(TestOpTensorCopy, CopyDeviceToHostTensor)
|
|||
|
||||
mgr.sequence()->eval<kp::OpTensorCopy>({ tensorA, tensorB });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
|
||||
// Making sure the GPU holds the same data
|
||||
// Making sure the GPU holds the same vector
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorB });
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
}
|
||||
|
||||
TEST(TestOpTensorCopy, CopyHostToDeviceTensor)
|
||||
|
|
@ -92,9 +92,9 @@ TEST(TestOpTensorCopy, CopyHostToDeviceTensor)
|
|||
std::vector<float> testVecA{ 4, 5, 6 };
|
||||
std::vector<float> testVecB{ 0, 0, 0 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA =
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA =
|
||||
mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost);
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor(testVecB);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor(testVecB);
|
||||
|
||||
// Only calling sync on device type tensor
|
||||
mgr.sequence()->eval<kp::OpTensorSyncDevice>({ tensorA, tensorB });
|
||||
|
|
@ -104,11 +104,11 @@ TEST(TestOpTensorCopy, CopyHostToDeviceTensor)
|
|||
|
||||
mgr.sequence()->eval<kp::OpTensorCopy>({ tensorA, tensorB });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
|
||||
// Making sure the GPU holds the same data
|
||||
// Making sure the GPU holds the same vector
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorB });
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
}
|
||||
|
||||
TEST(TestOpTensorCopy, CopyHostToHostTensor)
|
||||
|
|
@ -119,9 +119,9 @@ TEST(TestOpTensorCopy, CopyHostToHostTensor)
|
|||
std::vector<float> testVecA{ 5, 6, 7 };
|
||||
std::vector<float> testVecB{ 0, 0, 0 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA =
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA =
|
||||
mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost);
|
||||
std::shared_ptr<kp::Tensor> tensorB =
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB =
|
||||
mgr.tensor(testVecB, kp::Tensor::TensorTypes::eHost);
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
|
|
@ -131,11 +131,11 @@ TEST(TestOpTensorCopy, CopyHostToHostTensor)
|
|||
->eval<kp::OpTensorSyncDevice>({ tensorA })
|
||||
->eval<kp::OpTensorCopy>({ tensorA, tensorB });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
|
||||
// Making sure the GPU holds the same data
|
||||
// Making sure the GPU holds the same vector
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorB });
|
||||
EXPECT_EQ(tensorA->data(), tensorB->data());
|
||||
EXPECT_EQ(tensorA->vector(), tensorB->vector());
|
||||
}
|
||||
|
||||
TEST(TestOpTensorCopy, SingleTensorShouldFail)
|
||||
|
|
@ -145,7 +145,7 @@ TEST(TestOpTensorCopy, SingleTensorShouldFail)
|
|||
|
||||
std::vector<float> testVecA{ 6, 7, 8 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA =
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA =
|
||||
mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost);
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
TEST(TestOpTensorCreate, CreateSingleTensorSingleOp)
|
||||
{
|
||||
std::vector<float> testVecA{ 9, 8, 7 };
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
|
||||
{
|
||||
kp::Manager mgr;
|
||||
|
|
@ -15,7 +15,7 @@ TEST(TestOpTensorCreate, CreateSingleTensorSingleOp)
|
|||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
|
||||
EXPECT_EQ(tensorA->data(), testVecA);
|
||||
EXPECT_EQ(tensorA->vector(), testVecA);
|
||||
}
|
||||
|
||||
EXPECT_FALSE(tensorA->isInit());
|
||||
|
|
@ -29,11 +29,11 @@ TEST(TestOpTensorCreate, NoErrorIfTensorFreedBefore)
|
|||
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor(testVecB);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor(testVecB);
|
||||
|
||||
EXPECT_EQ(tensorA->data(), testVecA);
|
||||
EXPECT_EQ(tensorB->data(), testVecB);
|
||||
EXPECT_EQ(tensorA->vector(), testVecA);
|
||||
EXPECT_EQ(tensorB->vector(), testVecB);
|
||||
|
||||
tensorA->destroy();
|
||||
tensorB->destroy();
|
||||
|
|
@ -49,7 +49,7 @@ TEST(TestOpTensorCreate, ExceptionOnZeroSizeTensor)
|
|||
kp::Manager mgr;
|
||||
|
||||
try {
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecA);
|
||||
} catch (const std::runtime_error& err) {
|
||||
// check exception
|
||||
ASSERT_TRUE(std::string(err.what()).find("zero-sized") !=
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ TEST(TestOpTensorSync, SyncToDeviceMemorySingleTensor)
|
|||
std::vector<float> testVecPreA{ 0, 0, 0 };
|
||||
std::vector<float> testVecPostA{ 9, 8, 7 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor(testVecPreA);
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor(testVecPreA);
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ TEST(TestOpTensorSync, SyncToDeviceMemorySingleTensor)
|
|||
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorA });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), testVecPostA);
|
||||
EXPECT_EQ(tensorA->vector(), testVecPostA);
|
||||
}
|
||||
|
||||
TEST(TestOpTensorSync, SyncToDeviceMemoryMultiTensor)
|
||||
|
|
@ -31,9 +31,9 @@ TEST(TestOpTensorSync, SyncToDeviceMemoryMultiTensor)
|
|||
|
||||
std::vector<float> testVec{ 9, 8, 7 };
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::Tensor> tensorC = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorC = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
EXPECT_TRUE(tensorA->isInit());
|
||||
EXPECT_TRUE(tensorB->isInit());
|
||||
|
|
@ -47,7 +47,7 @@ TEST(TestOpTensorSync, SyncToDeviceMemoryMultiTensor)
|
|||
|
||||
mgr.sequence()->eval<kp::OpTensorSyncLocal>({ tensorA, tensorB, tensorC });
|
||||
|
||||
EXPECT_EQ(tensorA->data(), testVec);
|
||||
EXPECT_EQ(tensorB->data(), testVec);
|
||||
EXPECT_EQ(tensorC->data(), testVec);
|
||||
EXPECT_EQ(tensorA->vector(), testVec);
|
||||
EXPECT_EQ(tensorB->vector(), testVec);
|
||||
EXPECT_EQ(tensorC->vector(), testVec);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ TEST(TestPushConstants, TestConstantsAlgoDispatchOverride)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Algorithm> algo =
|
||||
mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.0, 0.0, 0.0 });
|
||||
|
|
@ -42,7 +42,7 @@ TEST(TestPushConstants, TestConstantsAlgoDispatchOverride)
|
|||
sq->eval<kp::OpAlgoDispatch>(algo, kp::Constants{ 0.3, 0.2, 0.1 });
|
||||
sq->eval<kp::OpTensorSyncLocal>({ tensor });
|
||||
|
||||
EXPECT_EQ(tensor->data(), kp::Constants({ 0.4, 0.4, 0.4 }));
|
||||
EXPECT_EQ(tensor->vector(), kp::Constants({ 0.4, 0.4, 0.4 }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -72,7 +72,7 @@ TEST(TestPushConstants, TestConstantsAlgoDispatchNoOverride)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Algorithm> algo =
|
||||
mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.1, 0.2, 0.3 });
|
||||
|
|
@ -85,7 +85,7 @@ TEST(TestPushConstants, TestConstantsAlgoDispatchNoOverride)
|
|||
sq->eval<kp::OpAlgoDispatch>(algo, kp::Constants{ 0.3, 0.2, 0.1 });
|
||||
sq->eval<kp::OpTensorSyncLocal>({ tensor });
|
||||
|
||||
EXPECT_EQ(tensor->data(), kp::Constants({ 0.4, 0.4, 0.4 }));
|
||||
EXPECT_EQ(tensor->vector(), kp::Constants({ 0.4, 0.4, 0.4 }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -115,7 +115,7 @@ TEST(TestPushConstants, TestConstantsWrongSize)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensor = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::shared_ptr<kp::Algorithm> algo =
|
||||
mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.0 });
|
||||
|
|
|
|||
|
|
@ -60,9 +60,9 @@ TEST(TestSequence, RerecordSequence)
|
|||
|
||||
std::shared_ptr<kp::Sequence> sq = mgr.sequence();
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({1, 2, 3});
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor({2, 2, 2});
|
||||
std::shared_ptr<kp::Tensor> tensorOut = mgr.tensor({0, 0, 0});
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({1, 2, 3});
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor({2, 2, 2});
|
||||
std::shared_ptr<kp::TensorT<float>> tensorOut = mgr.tensor({0, 0, 0});
|
||||
|
||||
sq->eval<kp::OpTensorSyncDevice>({ tensorA, tensorB, tensorOut });
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ TEST(TestSequence, RerecordSequence)
|
|||
|
||||
sq->eval();
|
||||
|
||||
EXPECT_EQ(tensorOut->data(), std::vector<float>({2, 4, 6}));
|
||||
EXPECT_EQ(tensorOut->vector(), std::vector<float>({2, 4, 6}));
|
||||
|
||||
algo->rebuild({tensorOut, tensorA, tensorB}, spirv);
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ TEST(TestSequence, RerecordSequence)
|
|||
sq->rerecord();
|
||||
sq->eval();
|
||||
|
||||
EXPECT_EQ(tensorB->data(), std::vector<float>({2, 8, 18}));
|
||||
EXPECT_EQ(tensorB->vector(), std::vector<float>({2, 8, 18}));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,8 @@ TEST(TestSpecializationConstants, TestTwoConstants)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
|
||||
std::shared_ptr<kp::Tensor> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::Tensor> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = mgr.tensor({ 0, 0, 0 });
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = mgr.tensor({ 0, 0, 0 });
|
||||
|
||||
std::vector<std::shared_ptr<kp::Tensor>> params = { tensorA,
|
||||
tensorB };
|
||||
|
|
@ -42,8 +42,8 @@ TEST(TestSpecializationConstants, TestTwoConstants)
|
|||
->record<kp::OpTensorSyncLocal>(params)
|
||||
->eval();
|
||||
|
||||
EXPECT_EQ(tensorA->data(), std::vector<float>({ 5, 5, 5 }));
|
||||
EXPECT_EQ(tensorB->data(), std::vector<float>({ 0.3, 0.3, 0.3 }));
|
||||
EXPECT_EQ(tensorA->vector(), std::vector<float>({ 5, 5, 5 }));
|
||||
EXPECT_EQ(tensorB->vector(), std::vector<float>({ 0.3, 0.3, 0.3 }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ TEST(TestTensor, ConstructorData)
|
|||
{
|
||||
kp::Manager mgr;
|
||||
std::vector<float> vec{ 0, 1, 2 };
|
||||
std::shared_ptr<kp::Tensor> tensor = mgr.tensor(vec);
|
||||
std::shared_ptr<kp::TensorT<float>> tensor = mgr.tensor(vec);
|
||||
EXPECT_EQ(tensor->size(), vec.size());
|
||||
EXPECT_EQ(tensor->data(), vec);
|
||||
EXPECT_EQ(tensor->vector(), vec);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@
|
|||
|
||||
TEST(TestWorkgroup, TestSimpleWorkgroup)
|
||||
{
|
||||
std::shared_ptr<kp::Tensor> tensorA = nullptr;
|
||||
std::shared_ptr<kp::Tensor> tensorB = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorA = nullptr;
|
||||
std::shared_ptr<kp::TensorT<float>> tensorB = nullptr;
|
||||
{
|
||||
std::shared_ptr<kp::Sequence> sq = nullptr;
|
||||
|
||||
|
|
@ -39,29 +39,29 @@ TEST(TestWorkgroup, TestSimpleWorkgroup)
|
|||
sq->record<kp::OpAlgoDispatch>(algorithm);
|
||||
sq->record<kp::OpTensorSyncLocal>(params);
|
||||
sq->eval();
|
||||
|
||||
std::vector<float> expectedA = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
|
||||
10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||
12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
|
||||
14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15
|
||||
};
|
||||
|
||||
std::vector<float> expectedB = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
|
||||
6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3,
|
||||
4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1,
|
||||
2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
|
||||
6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7
|
||||
};
|
||||
|
||||
EXPECT_EQ(tensorA->vector(), expectedA);
|
||||
EXPECT_EQ(tensorB->vector(), expectedB);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<float> expectedA = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
|
||||
10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||
12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
|
||||
14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15
|
||||
};
|
||||
|
||||
std::vector<float> expectedB = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
|
||||
6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3,
|
||||
4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1,
|
||||
2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
|
||||
6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7
|
||||
};
|
||||
|
||||
EXPECT_EQ(tensorA->data(), expectedA);
|
||||
EXPECT_EQ(tensorB->data(), expectedB);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue