| 334 | } // namespace |
| 335 | |
| 336 | TEST(TestMagicMindRuntimeOpr, Basic) { |
| 337 | REQUIRE_CAMBRICON_DEVICE(1); |
| 338 | auto cn = CompNode::load("cambricon0"); |
| 339 | MMNetwork network(cn, magicmind::DataType::FLOAT32, false); |
| 340 | size_t dtype_size = magicmind::DataTypeSize(magicmind::DataType::FLOAT32); |
| 341 | |
| 342 | // prepare parameter for addpad and conv |
| 343 | const int ni = 16, ci = 64, hi = 32, wi = 32; |
| 344 | const int no = 16, co = 64, ho = 32, wo = 32; |
| 345 | |
| 346 | // count tensor nums |
| 347 | int conv_input_count = ni * hi * wi * ci; |
| 348 | int relu_output_count = no * ho * wo * co; |
| 349 | |
| 350 | // prepare cpu origin data |
| 351 | std::vector<float> conv_input_cpu_data; |
| 352 | gen_rand_data(conv_input_cpu_data, conv_input_count, 256); |
| 353 | std::vector<float> add_input_cpu_data; |
| 354 | gen_rand_data(add_input_cpu_data, relu_output_count, 256); |
| 355 | std::vector<float> relu_output_cpu_data(relu_output_count); |
| 356 | std::vector<float> add_output_cpu_data(relu_output_count); |
| 357 | |
| 358 | auto mlu_deleter = [](void* p) { MGB_CNRT_CHECK(cnrtFree(p)); }; |
| 359 | void* conv_input_mlu_ptr; |
| 360 | void* add_input_mlu_ptr; |
| 361 | void* relu_output_mlu_ptr; |
| 362 | void* add_output_mlu_ptr; |
| 363 | |
| 364 | // malloc mlu mem for fusion input and output |
| 365 | MGB_CNRT_CHECK(cnrtMalloc(&conv_input_mlu_ptr, conv_input_count * dtype_size)); |
| 366 | MGB_CNRT_CHECK(cnrtMalloc(&add_input_mlu_ptr, relu_output_count * sizeof(float))); |
| 367 | MGB_CNRT_CHECK(cnrtMalloc(&relu_output_mlu_ptr, relu_output_count * sizeof(float))); |
| 368 | MGB_CNRT_CHECK(cnrtMalloc(&add_output_mlu_ptr, relu_output_count * sizeof(float))); |
| 369 | |
| 370 | // memory copy cpu->mlu |
| 371 | MGB_CNRT_CHECK(cnrtMemcpy( |
| 372 | conv_input_mlu_ptr, conv_input_cpu_data.data(), |
| 373 | conv_input_count * dtype_size, CNRT_MEM_TRANS_DIR_HOST2DEV)); |
| 374 | MGB_CNRT_CHECK(cnrtMemcpy( |
| 375 | add_input_mlu_ptr, add_input_cpu_data.data(), |
| 376 | relu_output_count * sizeof(float), CNRT_MEM_TRANS_DIR_HOST2DEV)); |
| 377 | std::unique_ptr<void, decltype(mlu_deleter)> conv_input_holder{ |
| 378 | conv_input_mlu_ptr, mlu_deleter}; |
| 379 | std::unique_ptr<void, decltype(mlu_deleter)> add_input_holder{ |
| 380 | add_input_mlu_ptr, mlu_deleter}; |
| 381 | std::unique_ptr<void, decltype(mlu_deleter)> relu_output_holder{ |
| 382 | relu_output_mlu_ptr, mlu_deleter}; |
| 383 | std::unique_ptr<void, decltype(mlu_deleter)> add_output_holder{ |
| 384 | add_output_mlu_ptr, mlu_deleter}; |
| 385 | |
| 386 | network.infer_model( |
| 387 | {conv_input_mlu_ptr, add_input_mlu_ptr}, |
| 388 | {relu_output_mlu_ptr, add_output_mlu_ptr}, |
| 389 | {Dims{{ni, hi, wi, ci}}, Dims{{no, ho, wo, co}}}); |
| 390 | |
| 391 | // result memory copy cnml->cpu |
| 392 | // memory copy cpu->mlu |
| 393 | MGB_CNRT_CHECK(cnrtMemcpy( |
nothing calls this directly
no test coverage detected