| 1329 | } |
| 1330 | |
| 1331 | void FunctionDefAndExecute(bool async) { |
| 1332 | TF_Status* status = TF_NewStatus(); |
| 1333 | TFE_ContextOptions* opts = TFE_NewContextOptions(); |
| 1334 | TFE_ContextOptionsSetAsync(opts, static_cast<unsigned char>(async)); |
| 1335 | TFE_Context* ctx = TFE_NewContext(opts, status); |
| 1336 | CHECK_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1337 | TFE_DeleteContextOptions(opts); |
| 1338 | |
| 1339 | string function_def = MatMulFunction(); |
| 1340 | TFE_ContextAddFunctionDef(ctx, function_def.data(), function_def.size(), |
| 1341 | status); |
| 1342 | CHECK_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1343 | |
| 1344 | for (bool clear_cache : {true, false, true}) { |
| 1345 | if (clear_cache) { |
| 1346 | TFE_ContextClearCaches(ctx); |
| 1347 | } |
| 1348 | TFE_TensorHandle* m = TestMatrixTensorHandle(); |
| 1349 | TFE_TensorHandle* retval[1] = {nullptr}; |
| 1350 | int num_retvals = 1; |
| 1351 | TFE_Op* op = TFE_NewOp(ctx, "MatMulFunction", status); |
| 1352 | ASSERT_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1353 | TFE_OpAddInput(op, m, status); |
| 1354 | ASSERT_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1355 | TFE_Execute(op, &retval[0], &num_retvals, status); |
| 1356 | ASSERT_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1357 | ASSERT_EQ(1, num_retvals); |
| 1358 | TFE_DeleteOp(op); |
| 1359 | TFE_DeleteTensorHandle(m); |
| 1360 | TF_Tensor* t = TFE_TensorHandleResolve(retval[0], status); |
| 1361 | TFE_DeleteTensorHandle(retval[0]); |
| 1362 | ASSERT_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1363 | float product[4] = {0}; |
| 1364 | EXPECT_EQ(sizeof(product), TF_TensorByteSize(t)); |
| 1365 | memcpy(&product[0], TF_TensorData(t), TF_TensorByteSize(t)); |
| 1366 | TF_DeleteTensor(t); |
| 1367 | EXPECT_EQ(7, product[0]); |
| 1368 | EXPECT_EQ(10, product[1]); |
| 1369 | EXPECT_EQ(15, product[2]); |
| 1370 | EXPECT_EQ(22, product[3]); |
| 1371 | } |
| 1372 | TFE_ContextRemoveFunction(ctx, "MatMulFunction", status); |
| 1373 | ASSERT_TRUE(TF_GetCode(status) == TF_OK) << TF_Message(status); |
| 1374 | TFE_DeleteContext(ctx); |
| 1375 | EXPECT_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status); |
| 1376 | TF_DeleteStatus(status); |
| 1377 | } |
| 1378 | TEST(CAPI, FunctionDefAndExecute) { FunctionDefAndExecute(false); } |
| 1379 | TEST(CAPI, FunctionDefAndExecuteAsync) { FunctionDefAndExecute(true); } |
| 1380 |
no test coverage detected