diff --git a/src/fpga/api.cpp b/src/fpga/api.cpp index 97746d0b203523b9337af17346b623d96dbf5a88..d3f473a7f43714592779de941ed1a6ea53baea83 100644 --- a/src/fpga/api.cpp +++ b/src/fpga/api.cpp @@ -22,7 +22,7 @@ limitations under the License. */ #include "fpga/filter.h" #include "fpga/image.h" #define FPGA_TEST_MODE -// #define PADDLE_MOBILE_OS_LINUX +#define PADDLE_MOBILE_OS_LINUX namespace paddle_mobile { namespace fpga { diff --git a/test/fpga/test_resnet50.cpp b/test/fpga/test_resnet50.cpp index 6754a51fa55b0744b94ee70209da1a3fe88f2f32..8a6a9dc8af836010695c6c6dc30e81ba224c7ffd 100644 --- a/test/fpga/test_resnet50.cpp +++ b/test/fpga/test_resnet50.cpp @@ -11,34 +11,107 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ - +#include #include "../test_include.h" -static const char *g_resnet_combine = "../models/resnet50"; +#include "fpga/api.h" +void readStream(std::string filename, float *buf) { + std::ifstream in; + in.open(filename, std::ios::in); + if (!in.is_open()) { + std::cout << "open File Failed." << std::endl; + return; + } + string strOne; + int i = 0; + while (!in.eof()) { + in >> buf[i]; + i++; + } + in.close(); +} +void convert_to_chw(int16_t **data_in, int channel, int height, int width, + int16_t *data_tmp) { + int64_t amount_per_side = width * height; + for (int h = 0; h < height; h++) { + for (int w = 0; w < width; w++) { + for (int c = 0; c < channel; c++) { + *(data_tmp + c * amount_per_side + width * h + w) = *((*data_in)++); + } + } + } +} + +void dump(std::string filename, const Tensor input_tensor) { + auto dataptr = input_tensor.data(); + std::ofstream out(filename.c_str()); + float result = 0; + for (int i = 0; i < input_tensor.numel(); ++i) { + result = paddle_mobile::fpga::fp16_2_fp32(dataptr[i]); + out << result << std::endl; + } + out.close(); +} +void dump_stride(std::string filename, const Tensor input_tensor, + const int dumpnum) { + int c = (input_tensor.dims())[1]; + int h = (input_tensor.dims())[2]; + int w = (input_tensor.dims())[3]; + auto data_ptr = input_tensor.data(); + int16_t *data_tmp = (int16_t *)malloc(c * h * w * sizeof(int16_t)); + int16_t *data_ptr_16 = (int16_t *)data_ptr; + convert_to_chw(&data_ptr_16, c, h, w, data_tmp); + // const int16_t *dataptr = input_tensor.data(); + std::ofstream out(filename.c_str()); + float result = 0; + int stride = input_tensor.numel() / dumpnum; + stride = stride > 0 ? stride : 1; + for (int i = 0; i < input_tensor.numel(); i += stride) { + result = paddle_mobile::fpga::fp16_2_fp32(data_tmp[i]); + out << result << std::endl; + } + out.close(); + free(data_tmp); +} +static const char *g_resnet50 = "../models/resnet50"; +const std::string g_image_src_float = "../images/image_src_float"; int main() { - DLOG << paddle_mobile::fpga::open_device(); + paddle_mobile::fpga::open_device(); paddle_mobile::PaddleMobile paddle_mobile; - // if (paddle_mobile.Load(std::string(g_resnet_combine) + "/model", - // std::string(g_resnet_combine) + "/params", true)) { - if (paddle_mobile.Load(std::string(g_resnet_combine), true)) { - std::vector dims{1, 3, 224, 224}; + if (paddle_mobile.Load(std::string(g_resnet50), true)) { Tensor input_tensor; SetupTensor(&input_tensor, {1, 3, 224, 224}, static_cast(0), static_cast(1)); - - std::vector input(input_tensor.data(), - input_tensor.data() + input_tensor.numel()); - + readStream(g_image_src_float, + input_tensor.mutable_data({1, 3, 224, 224})); paddle_mobile.FeedData(input_tensor); - for (int i = 0; i < 1000; i++) { - paddle_mobile.Predict_To(-1); - if (i % 100 == 0) std::cout << i << std::endl; - } + paddle_mobile.Predict_To(-1); + /*for(int i = 0; i < 73; i++) + { + auto tensor_ptr = paddle_mobile.FetchResult(i); + std::string saveName = "resnet50_result_" + std::to_string (i); + paddle_mobile::fpga::fpga_invalidate((*tensor_ptr).data(), + tensor_ptr->numel()); dump_stride(saveName, (*tensor_ptr), 20); + //dump(saveName, (*tensor_ptr)); + }*/ - // paddle_mobile.Predict_From(73); - // paddle_mobile.Predict_From_To(72, 73); - - DLOG << "Computation done"; + /*std::shared_ptr output_tensor = paddle_mobile.FetchResult(73); + (*output_tensor).dump("resnet50_result_73"); + output_tensor = paddle_mobile.FetchResult(74); + (*output_tensor).dump("resnet50_result_74");*/ + std::shared_ptr output_tensor = paddle_mobile.FetchResult(74); + float max = 0; + auto data_ptr = output_tensor->data(); + int maximumIdx = 0; + for (int i = 0; i < (*output_tensor).numel(); i++) { + if (data_ptr[i] > max) { + maximumIdx = i; + max = data_ptr[i]; + } + } + std::cout << "index : " << maximumIdx << ", value : " << max + << std::endl; + std::cout << "Computation done" << std::endl; return 0; } }