• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    NNL: a domain-specific language for neural networks ①

    2020-07-12 02:34:16WangBingrui王秉睿ChenYunji
    High Technology Letters 2020年2期

    Wang Bingrui(王秉睿) , Chen Yunji

    (*School of Computer Science and Technology, University of Science and Technology of China, Hefei 230027, P.R.China) (**Intelligent Processor Research Center, Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100190, P.R.China)

    Abstract

    Key words:artificial neural network (NN), domain-specific language (DSL), neural network (NN) accelerator

    0 Introduction

    Generally, there are two evolving trends of neural networks (NNs). The first is that the number of neural network models has increased rapidly. One of the most well-known neural networks is the multi-layer perceptron (MLPs). By increasing the number of layers, MLPs are evolving to powerful variants, such as convolutional neural networks (CNNs) that specify convolutional and sub-sampling layers to handle 2D images[1]. In the meantime, the dimensions and parameters of NNs have also grown tremendously. For instance, the runner-up in ImageNet Challenge 2014, VGGNet[2], contains 16 layers with more than 140 M parameters. Due to the wide variations in network topologies, learning algorithms, and parameters, general-purpose programming languages (e.g., C/C++, Python, and Matlab) cannot efficiently prototype and compare different NNs. Moreover, it is a challenging task to evaluate the performance of NNs on different hardware platforms. Typically, it requires deep understanding of architecture-level details, such as cache-line size, SIMD widths, and the number of cores, to optimize the performance. As an illustrative example, the performance of different implementations of CNN for classifying images on a multi-core processor can vary about 20× between a tentative implementation and an optimized one. In addition, as today’s hardware architectures are advancing towards more heterogeneous processing units (multi-cores, GPUs, FPGAs, and specialized accelerators), various architecture-specific programming models, such as OpenMP, Pthreads, and CUDA, further aggravate the burden of programming neural networks.

    In this work, a domain-specific language (DSL), called neural network language (NNL), is proposed to deliver both productivity of NN programming and portable performance of NN execution across different hardware platforms. Its basic idea is to abstract the neural network as a directed graph of blocks. A block basically describes (forward/backward) operations on a specific neuron topology, and thus it mainly consists of 3 components, i.e., connection, forward operators, and backward operators. The main intuition of such block graph is that an NN can be regarded as the sequential composition of operations applied to a group of structured neurons. Based on the block-graph abstraction, the proposed NNL is enough expressive to rapidly prototype most neural networks with various sizes.

    To enable portable performance of NN executions on different hardware platforms, the NNL compiler is built to transform the NNL program to an efficient low-level architecture with special designed code. More specifically, the (default/forward/backward) operations applied to structured neurons are translated to standard matrix/vector operations in order to take advantage of portable, high-performance libraries such as Basic Linear Algebra Subroutines (BLAS) and Intel Math Kernel Library (MKL). During the code generation, the compiler benefits significantly from the rich semantics offered by NNL. For instance, the compiler can easily reason about the boundary of matrices/vectors. They are explicitly specified by the connection component of a block. In short, the proposed domain-specific language not only raises the productivity level of NN programming, but also allows high performance learning/prediction of NN on various platforms.

    This study makes the following contributions:

    (1) A domain-specific language, NNL, is proposed for programming neural networks. The proposed NNL features show abundant expressiveness to efficiently describe various types of neural networks.

    (2) A compiler for NNL is presented to translate the NNL to efficient architecture-specific implementations, allowing the NNL program to achieve portable performance across different architectures.

    (3) 4 representative and widely-used neural networks are described with the proposed language and executed on 3 different platforms, i.e., CPU, GPU, and a neural network accelerator, DaDianNao[3]. For different types of neural networks, baseline implementations with general-purpose languages such as C++ and CUDA are provided. Caffe framework is used to build networks for the CPU and GPU platforms. It is shown that, on average, NNL code is 14.5% better than the baselines across these 3 platforms.

    1 Neural network programming dilemmas

    Nowadays, neural network applications can be programmed on different ways, including machine learning libraries, neural network frameworks or domain-specific languages. To name a few, Pylearn2[4]and DLPLib[5]are built on machine learning libraries. There also exists several programming frameworks targeting special neural networks such as CNNs, and Caffe[6]and Tensorflow[7]are two of those notable examples. Latte[8], OptiML[9]and Swift for TensofFlow[10]are domain specific languages for deep neural networks and general machine learning tasks. Some researchers concentrate on the intermediate representation and low-level virtual machine for machine learning DSLs, e.g., Relay[11]and TVM[12]. Although all these frameworks can be used for programming neural networks, the key drawback is that they cannot describe different neural networks in a unified and flexible manner, leading to considerable reimplementation efforts when adapting to a new type of neural networks.On the other hand, the semantics of Latte is general-purpose and doesn’t take advantage of the domain knowledge to achieve productivity. Therefore, it is expected that a programming language exactly targeting the domain of general neural networks would be very helpful for NN programming.

    In addition, although stated programming frameworks or languages have been widely used for neural network programming, the underlying implementations may not be compatible with a wide variety of hardware platforms, let alone to fully exploiting their computational ability. In addition to CPU and GPUs, emerging neural network accelerators, such as DianNao[13], DaDianNao,ShiDianNao[14]and Cambricon[15], are attracting more attentions. Thus, a neural network programming model or language should be able to achieve portable performance on CPUs, GPUs, and ASIC accelerators.

    2 Neural network language

    This section presents the syntax of the proposed neural network language and further illustrates it with examples.

    2.1 Language syntax

    Fig.1 shows the language syntax of the NNL. The programming model of NNL is based on graph description, thus the syntax describes 2 primary components of graph, that is, nodes and edges among them. NN layers are defined asblocksand the construction of layers astopology. The whole program of NNL mainly comprises the above 2 parts.

    ProgramA program in NNL consists of at most one-time declaration, a nonempty list ofblocks, and ablockinst. The time declaration is an assignment to a variable namedCycle, which is required by neural networks with temporal behaviors, e.g., RNN and LSTM[16].

    BlockA block declaration consists of the keyword block, a block name, a list of variables, and the block body. The variables are used as parameters of the block body. The block body consists of abasicBlockor ablockinst. ThebasicBlockdeclaration includes a non-empty list of port, aconnection, and acalculation. Theblockinstconsists of a nonempty list ofinstandtopo. Hence, theblockinstprovides the instantiation of blocks and creation oftopo.

    PortThe ports are treated as the interface of blocks, and a port of a block can be declared with its name and omissible dimension expression.

    ConnectionThe connection declaration is composed of the keyword connection, a nonempty list of loops with at most one keyword share as the constraint of the loop and a link. A loop declaration contains a loop expression that can be denoted as (i;start;end;step). The loop expression indicates that the variableiincreases from start to end (not included) with a stride step. In addition, the keyword share means that the loop locates in the share scope. The link declaration specifies the In and Out with their shapes characterized by the dimension expressionexpr. The connection between the In and Out is denoted by the symbol <->. Apparently, the link declaration is the core of a connection declaration.

    CalculationThe calculation declaration, which is a part of thebasicBlockdeclaration, consists of the keyword once, forward or backward with a nonempty list of statements. The statements in the forward/backward pass define the forward/backward algorithms applied to a particular part of the neural network, while the once statement is used for initialization, and it only executes once.

    InstantiationTheinstis to instantiate the block declaration with actual parametersexpr. Furthermore, a block instance can also be built in blocks denoted as portblock(), passblock() and streamblock().

    TopologyThetopo, which describes the directed connection relationship between ports of instantiated blocks, is specified by a sequence of blocks with a port and unidirectional arrows between neighboring elements recursively. In order to describe thetopoefficiently, the ports in a block can be omitted and two different kinds of symbols (-> and ^) are used to represent the arrows. For example, b1->b2->b3 is the abbreviation of b1(Out)->b2(In) and b2(Out)->b3(In), while b1^b2 is the abbreviation of b1(Out)->b2(Weight), where Weight is an implicit port used for blocks with connection.

    ExpressionandstatementThe operators are classified intouopandbop. All the variables in NNL can be scalar, vector or matrix. The scalars include constants, declared variables, and results of reduction functions such asMax() andSum(). The vectors include declared vector variables, which can only beportname representing the data of ports. In addition, port names with the prefixDeltarepresent the gradient port with respect to the input port. Moreover, the vectors can also be the result of mathematical functions such asExp() andLog(). Thetis a built-in vector variable, elements of which range from 1 toCycle.

    Fig.1 The syntax of proposed NNL

    2.2 Block example

    As shown in Fig.2, there are 4 types of basic blocks, i.e.,connection,calculation,conn-calc, andcommonblock.

    Fig.2(a) shows the declaration of theconnectionblock. It describes connections between the neurons in a specific part of the neural network. Thesize1 andsize2 are parameters of the block, and they are used to specify the dimension of the ports such as In and Out. The key of the connection block is the connection definition, and it is used for describing the connections between the In and Out.

    Fig.2(b) presents thecalculationblock. This block mainly contains 2 calculation passes, i.e., forward and backward pass, specified by the keyword forward and backward, respectively. The forward pass contains all the calculations that are used in the forward algorithm of the neural network, while the backward pass consists of all the calculations for the backward algorithm of the neural network.

    Fig.2 Basic block construct

    Fig.2(c) is theconn-calcblock that contains both the connection and the calculation, while Fig.2(d) is an example of thecommonblock. Actually, thecalculationblock is a special case of thecommonblock, that is,commonblock with only 2 ports, one for input and the other for output.

    2.3 CNN example

    Fig.3 shows the code example for building a typical convolution neural network. As shown above, the programmers only need to provide three more block declarations, i.e., convolution, pooling, and lrn. The convolution is connected by the active operation ac1, while the pooling is connected by the active operation ac1 and lrn. The lrn is further connected with the active operation ac2 and ac3.

    3 Implementation

    This section introduces the language implementation and describes the techniques for compiling the NNL programs to high-performance platform-specific code. NNL uses domain-specific knowledge to reason about programs at a higher level than a general purpose language or a library, which allows to achieve portable performance on various hardware platforms.

    Fig.3 Using NNL for constructing a CNN example

    3.1 Compiler overview

    Fig.4 shows the compiling framework of NNL. The compiler mainly contains 4 main phases: the front-end, intermediate representation (IR) generation, IR analysis and optimization, and platform-specific code generation.

    Fig.4 Compiling framework for NNL

    To reduce the efforts required to construct the front-end, NNL is implemented as an embedded DSL within C++ language, so that it can reuse the front-end of C++. Moreover, the object-oriented features of C++, such as composition, inheritance, and operator overloading, allow the NNL to have a flexible syntax. Nevertheless, NNL is not limited to C++, and other general-purpose languages (e.g., Scala and Python) with such features can be used as NNL’s host languages as well.

    In contrast to traditional embedded DSLs that are constrained to the backends of host languages, NNL employs an intermediate representation (IR), i.e., the directed graph of blocks or topology, in order to conduct IR-based optimizations and target heterogeneous architectures. By analyzing the IR, compiler can generate different tables for facilitating platform-specific code generation. During the generation of tables, based on the connection between different blocks, several domain-specific optimizations are conducted to reduce the memory consumption and improve the execution efficiency. Details on topology generation, analysis and optimization are discussed below.

    The final stage is platform-specific code generation. NNL provide separate backends for different platforms: C code for CPUs, CUDA/OpenCL code for GPUs, and assemble instructions for the accelerator. Since the basic operations of neural networks are matrix(vector)-related computations, the key of code generation is to produce executable codes for different platforms directly.

    3.2 Topology generation

    The graph topology is generated from the block instances. More specifically, the block declaration first provides the structural description of the neural network components. Then, multiple block instances can be created from the block declaration, sharing the same parameters. Once all block instances are built, the topology of different block instances can be intuitively generated according to the symbol -> and ^. The topology generation does not rely on any platform, and the back-end will generate platform-specific code from the topology-based IR.

    3.3 Topology analysis

    During the topology analysis, the compiler generates the port table, including the in-port and out-port table. Such tables are generated from the in-ports and out-ports (which are used for data exchange between connected nodes) of the block declaration. Both the in-port and out-port tables store the data information such as address, size, and dimension, etc. Also, for the sink block of the topology graph, the termination status is added to the out-port tables. Once the termination status is set as false, the neural network needs to undergo back propagation.

    In NNL, there are 2 types of connection between blocks, that is, ->for neuron transfer and ^ for synapse transfer. If a block is connected to another one with ->, the compiler would update the related entries in the in-port table. The compiler would also add the out-ports information of the block into the out-port table. Therefore, the in-port and out-port table would have overlapped data. Moreover, if more than one blocks are connected to the same block with ->, additional information (i.e., the default addition operation applied to these out-ports data and in-port data) should be attached to the corresponding entries in the in-port and out-port table.

    If two blocks are connected by ^, the synapse table, which stores the corresponding synapses (or weights), would be created or updated. The synapse table is only used for generating code for a basic block containing connection declaration. This will be elaborated in the following code generation section.

    In summary, during the topology analysis, the in-port table, out-port table and synapse table are generated for facilitating platform-specific code generation. To initiate code generation, a start status is set in all the tables to indicate whether the code generation should start. Among these tables, only in-port and out-port table are necessary for arbitrary network, while the synapse table is needed for some neural networks such as MLP and CNN.

    3.4 Domain-specific optimization

    During the generation of tables from the graph topology, the compiler also conducts two domain-specific optimizations, including the data merging and data expansion. In fact, such optimization can be easily implemented with the help of various tables generated from the topology-based IR.

    DatamergingIn the so-called data merging optimization, duplicated data can be merged together to reduce the memory consumption. There are a lot of data reuse due to the special structure of neural networks.The number of data reuse increases significantly with the size of CNN kernel, and the percentage of reused data also increases with feature map size. One more illustrative example is that, for two interconnect blocks, the out-port data of the source block might be the in-port data of the destination block. For all those data reuses, the compiler only allocates memory spaces for the reused data once. Therefore, the total memory consumption can be significantly reduced. For instance, for the workload LeNet-5[17], the memory consumption can be reduced by 12% by using the data merging technique.

    DataexpansionThe basic idea of data expansion optimization is to expand scalar/vector/matrix as matrices, so as to take advantage of highly efficient implementations for matrix operations, which might be compute-bound operations that can better exploit the computation capacity of modern multi-/many-core architectures[18]on different platforms. More specifically, the data expansion optimization is enforced on the blocks connected to the original variables or other blocks with the symbol ^. In other words, data expansion only works for the blocks with synapses.

    The compiler leverages rich semantics provided by the NNL to efficiently conduct data expansion. In more detail, as synapses only appear in the blocks with the connection, the compiler can easily expand the data to matrices by exploiting the structure specified by the connection declaration and the synapse table generated after the topology analysis. Apparently, during the data expansion, more memory space is required to gain better data parallelism. Our compiler carefully controls the tradeoff between the data merging and data expansion to balance the achieved performance and consumed memory.

    3.5 Executable codes generation

    Based on the tables generated from the topology analysis, the platform-specific code can be generated. Moreover, for a neural network, the generated code contains 2 parts, one for the prediction process, and the other for the training process.

    For the prediction process, the compiler should handle the data in port tables and the operations in the forward pass. For the data in the inport table, the compiler allocates corresponding memory space based on the stored data information (e.g., data size). For the operations in the forward pass, the compiler can infer what operations (i.e., scalar operation or vector operation) should be conducted according to the calculation expression. Also, there is a default matrix-vector operation applied to the connection phase for data from the in-port and synapse table. Once all these operations are processed, the outport table should be updated. In this process, the compiler can dynamically optimize the memory usage. Once the compiler completes the table analysis, it determines whether a back propagation should be conducted based on the termination status. If the termination status is true, the compiler finishes the code generation. Otherwise, the back-propagation process is conducted for neural network training.

    For the training process, the compiler also analyzes various tables for error propagation and parameter updates. More specifically, the operations defined in the backward pass of a block are applied to the parameters. Once the start status is detected, the compiler terminates the backward code generation. In this case, both the codes for prediction and training process are generated through the IR.

    For both the prediction and training process, the compiler efficiently translates the (forward/backward) operations to function calls of platform-specific libraries, that is, BLAS for CPUs, cuBLAS for GPUs, and the built-in library for the accelerator.

    4 Experiments

    This section evaluates a set of artificial neural networks written in NNL on different platforms, and compares them to baseline implementations with existing programming frameworks.

    4.1 Platforms

    The configurations of evaluated platforms (i.e., CPU, GPU and the accelerator) are listed as follows.

    CPUThe CPU is an x86-CPU with 256-bit SIMD support (Intel Xeon E5-2620, 2.10 GHz, 64 GB memory). GCC v4.7.2 is used to compile all benchmarks with options (-O2 -lm -march=native) to enable SIMD instructions.

    GPUThe GPU is a modern GPU card (NVIDIA K40M, 12 GB GDDR5, 4.29 TFlops peak at a 28 nm process).

    AcceleratorThe accelerator for evaluation is DaDianNao, a state-of-the-art NN accelerator exhibiting remarkable energy-efficiency improvement over a GPU.

    4.2 Benchmarks

    Four representative and widely used NN techniques, including MLP, CNN, LSTM, and LRCN, are chosen as our benchmarks. The detailed configurations of these NN are listed in Table 1. These benchmarks represent state-of-the-art neural networks that are widely used in both academics and industry.

    For all these benchmarks, the baseline is implemented by using a general-purpose language, e.g., C++ for the CPU platform and CUDA for the GPU platform. Due to the limitation of the framework, only optimized implementations of the MLP and CNN for both the CPU and GPU platforms can be obtained by applying Caffe. As a comparison, all the NN benchmarks are programmed with NNL and compiled targeting CPU, GPU, and the NN accelerator.

    Table 1 The NN benchmarks for evaluation (H stands for hidden layer, C stands for convolutional layer, K stands for kernel, P stands for pooling layer, F stands for classifier)

    Fig.5 shows the performance comparison of NNL, Caffe and C++ code on the CPU, GPU and NN accelerator.The experiment result shows that, on average, the executable program compiled from NNL code is 14.5% better than the baselines across these 3 platforms.

    Fig.5(a) shows the performance comparison of NNL, Caffe and C++ code on the CPU platforms. All these 3 implementations eventually invoke the native BLAS libraries. The first observation is that the Caffe code perform significantly better than the CPU baseline, since the Caffe framework is highly tuned for the CNN and MLP algorithm. The second observation is that the NNL code performs much better than the CPU baseline for the pool and MLP network. However, on the rest 3 scenarios, i.e., conv, lstm, and lrcn, the NNL code cannot outperform the CPU baseline. The potential reason is that data expansion results in too much off-chip memory access. The detailed analysis on the aggressiveness of data expansion should be left as our future work. Fig.5(b) compares the execution performance of NNL code, Caffe code and CUDA code on the GPU platform. It shows that both NNL and Caffe significantly outperform the GPU baseline. Because Caffe is a highly tuned library, it is natural that Caffe obtains much better results compared with the baseline for the conv, pool, and MLP networks. Moreover, since NNL expands data to generate large matrix-matrix operations to fully take advantage of the high parallelism of the GPU platform, the performance of the NNL code is comparable to that of the Caffe implementation. In fact, even on the lstm and lrcn network, where the Caffe cannot handle flexibly, the NNL code performs better than the baseline code.

    (a) CPU

    (b) GPU

    (c) NN accelerator

    Experiments for the neural network accelerator are also conducted and the results in Fig.5(c) show that NNL code does not outperform the assemble instructions of the accelerator. This is because the accelerator is specifically designed for CNN. It is not enough to expand the data as a large matrix to benefit the hardware for NNL, while the assemble instructions is highly tied with the hardware to take full advantage of the accelerator.

    5 Conclusion

    As the sizes and types of neural network models continue to grow, how to efficiently build neural network models for different platforms is very challenging. In this paper, a neural network domain-specific language, NNL, is proposed specifically targeting the NN programming domain. NNL raises the productivity level of NN programming by abstracting an NN as a directed graph of blocks. Moreover, the NNL compiler enables portable performance of NN execution across different hardware platforms (e.g., CPUs, GPU, and ASIC). Experiments are conducted to show that NNL is efficient and flexible for fast prototyping of various NNs, and the execution performance is comparable to state-of-the-art NN programming frameworks.

    免费高清视频大片| 成人午夜高清在线视频| 18禁黄网站禁片午夜丰满| 黄色丝袜av网址大全| 麻豆一二三区av精品| 三级男女做爰猛烈吃奶摸视频| 国产一级毛片七仙女欲春2| 欧美av亚洲av综合av国产av| 99精品欧美一区二区三区四区| 亚洲五月天丁香| 亚洲色图 男人天堂 中文字幕| 高清在线国产一区| 黑人巨大精品欧美一区二区mp4| 亚洲国产看品久久| 中亚洲国语对白在线视频| 99久久综合精品五月天人人| 国内精品一区二区在线观看| 久久亚洲精品不卡| 99久久无色码亚洲精品果冻| 日韩欧美在线二视频| 精品国内亚洲2022精品成人| 久久久久久久久中文| 在线观看免费视频日本深夜| 国产不卡一卡二| 午夜亚洲福利在线播放| 欧美另类亚洲清纯唯美| 欧美日韩瑟瑟在线播放| 国产精品av视频在线免费观看| 51午夜福利影视在线观看| 久久久国产成人免费| 国产精品久久电影中文字幕| 精品福利观看| 色吧在线观看| 国产精品久久视频播放| 黑人欧美特级aaaaaa片| 悠悠久久av| 国产成年人精品一区二区| 在线观看午夜福利视频| 男女那种视频在线观看| 99久久久亚洲精品蜜臀av| 黄片小视频在线播放| www.www免费av| 亚洲欧洲精品一区二区精品久久久| 搡老熟女国产l中国老女人| 国产一级毛片七仙女欲春2| 国产野战对白在线观看| 天堂动漫精品| 国产黄a三级三级三级人| www.999成人在线观看| 免费大片18禁| 后天国语完整版免费观看| 狂野欧美白嫩少妇大欣赏| 首页视频小说图片口味搜索| www.熟女人妻精品国产| 99久久99久久久精品蜜桃| 亚洲专区国产一区二区| 日韩欧美 国产精品| 女人高潮潮喷娇喘18禁视频| 男人舔女人下体高潮全视频| 国产成人福利小说| 狠狠狠狠99中文字幕| 性色avwww在线观看| 日本在线视频免费播放| 啦啦啦韩国在线观看视频| 欧美日韩瑟瑟在线播放| 男人舔奶头视频| 黄色女人牲交| 听说在线观看完整版免费高清| 成人av在线播放网站| 日日夜夜操网爽| 成人特级黄色片久久久久久久| 精品国产三级普通话版| 国产精品久久久av美女十八| 757午夜福利合集在线观看| 国产成人精品久久二区二区免费| 久久精品亚洲精品国产色婷小说| 国产精品一区二区三区四区免费观看 | 校园春色视频在线观看| 国内久久婷婷六月综合欲色啪| 亚洲国产欧美网| 欧美日韩综合久久久久久 | 精品久久久久久,| 哪里可以看免费的av片| 亚洲aⅴ乱码一区二区在线播放| 嫁个100分男人电影在线观看| 午夜激情福利司机影院| 丰满人妻熟妇乱又伦精品不卡| 又黄又粗又硬又大视频| 国产高清视频在线播放一区| 国产精品久久久人人做人人爽| 久久久国产精品麻豆| 欧美黑人巨大hd| 两个人视频免费观看高清| 狠狠狠狠99中文字幕| 男人和女人高潮做爰伦理| 亚洲第一欧美日韩一区二区三区| 国产激情偷乱视频一区二区| 久久国产精品影院| 国产男靠女视频免费网站| 国产成年人精品一区二区| 一个人免费在线观看电影 | 精品福利观看| 国产不卡一卡二| 欧美成人性av电影在线观看| 免费在线观看成人毛片| 国产探花在线观看一区二区| 国产亚洲精品av在线| 淫妇啪啪啪对白视频| 亚洲av成人精品一区久久| 久久人妻av系列| 国内精品久久久久精免费| 国产精品乱码一区二三区的特点| ponron亚洲| 草草在线视频免费看| 欧美一区二区国产精品久久精品| 99久久无色码亚洲精品果冻| 在线看三级毛片| 久久国产精品人妻蜜桃| 国产伦在线观看视频一区| 麻豆久久精品国产亚洲av| 午夜福利欧美成人| 90打野战视频偷拍视频| 丝袜人妻中文字幕| 色尼玛亚洲综合影院| 黑人操中国人逼视频| 国产一区二区三区视频了| 色噜噜av男人的天堂激情| 国产精品av久久久久免费| 别揉我奶头~嗯~啊~动态视频| 观看免费一级毛片| 黄色日韩在线| 亚洲国产日韩欧美精品在线观看 | 亚洲欧洲精品一区二区精品久久久| 三级男女做爰猛烈吃奶摸视频| 国产主播在线观看一区二区| 人人妻,人人澡人人爽秒播| 国产一区二区在线av高清观看| 女警被强在线播放| 国产伦精品一区二区三区四那| 欧美日韩精品网址| 18禁黄网站禁片免费观看直播| 国产伦人伦偷精品视频| 一边摸一边抽搐一进一小说| 一本精品99久久精品77| 午夜福利在线观看免费完整高清在 | 国产欧美日韩精品亚洲av| 色播亚洲综合网| 老司机午夜福利在线观看视频| 国产精品野战在线观看| 在线观看免费视频日本深夜| 亚洲成人中文字幕在线播放| 19禁男女啪啪无遮挡网站| 亚洲黑人精品在线| 老司机午夜福利在线观看视频| 国产激情欧美一区二区| 国产亚洲av高清不卡| 啦啦啦免费观看视频1| 亚洲av电影在线进入| 最近最新免费中文字幕在线| 97超级碰碰碰精品色视频在线观看| 国产伦精品一区二区三区四那| 我的老师免费观看完整版| 国产午夜精品久久久久久| 国产欧美日韩一区二区精品| 亚洲人与动物交配视频| 男人的好看免费观看在线视频| 国产蜜桃级精品一区二区三区| 男人舔女人的私密视频| 一区福利在线观看| 国产成人精品久久二区二区91| 欧美极品一区二区三区四区| 国产精品99久久99久久久不卡| 国内揄拍国产精品人妻在线| 精品国产乱码久久久久久男人| 亚洲精品456在线播放app | 国产视频一区二区在线看| 在线永久观看黄色视频| 日本免费a在线| 久久精品国产99精品国产亚洲性色| 搡老熟女国产l中国老女人| 久久欧美精品欧美久久欧美| 国产精品爽爽va在线观看网站| 麻豆成人午夜福利视频| av黄色大香蕉| 国语自产精品视频在线第100页| 国产乱人视频| 99热只有精品国产| 欧美在线一区亚洲| 很黄的视频免费| 国产免费男女视频| 久久亚洲精品不卡| 国产精品 国内视频| 99久国产av精品| 欧美极品一区二区三区四区| 操出白浆在线播放| 亚洲中文日韩欧美视频| 午夜福利高清视频| 久久久久久大精品| 亚洲欧美激情综合另类| 中文资源天堂在线| 国产三级在线视频| 变态另类丝袜制服| av女优亚洲男人天堂 | 一二三四在线观看免费中文在| 久久久久亚洲av毛片大全| 亚洲国产欧洲综合997久久,| cao死你这个sao货| 国产成人啪精品午夜网站| 色综合婷婷激情| 日本免费一区二区三区高清不卡| 色综合亚洲欧美另类图片| 天天躁日日操中文字幕| 国产v大片淫在线免费观看| 亚洲午夜理论影院| 国产99白浆流出| 色吧在线观看| 午夜免费激情av| 熟女少妇亚洲综合色aaa.| 搡老熟女国产l中国老女人| 国产精品一及| 美女扒开内裤让男人捅视频| 国产av在哪里看| 桃红色精品国产亚洲av| 曰老女人黄片| 久久久精品欧美日韩精品| 国产精品永久免费网站| 国产一区在线观看成人免费| 免费在线观看亚洲国产| 亚洲成人久久性| 亚洲欧美日韩卡通动漫| 香蕉久久夜色| 国产一区二区在线观看日韩 | 久久精品aⅴ一区二区三区四区| 欧美成人性av电影在线观看| 中出人妻视频一区二区| 特级一级黄色大片| 又粗又爽又猛毛片免费看| 国产精品一区二区三区四区久久| 性色avwww在线观看| 国产久久久一区二区三区| 免费av不卡在线播放| 国产精品久久久人人做人人爽| 母亲3免费完整高清在线观看| 亚洲第一欧美日韩一区二区三区| 又黄又粗又硬又大视频| 91av网一区二区| 最近最新中文字幕大全免费视频| 狂野欧美激情性xxxx| 国产精品一区二区精品视频观看| 亚洲激情在线av| 别揉我奶头~嗯~啊~动态视频| 九色国产91popny在线| 久久人妻av系列| 国产一区二区三区视频了| 久久精品人妻少妇| 午夜福利免费观看在线| 国产精品 欧美亚洲| 久99久视频精品免费| 亚洲专区字幕在线| 91麻豆精品激情在线观看国产| 麻豆国产av国片精品| 好看av亚洲va欧美ⅴa在| 欧美又色又爽又黄视频| 婷婷六月久久综合丁香| 欧美日韩一级在线毛片| 99国产精品一区二区三区| 美女黄网站色视频| 99久久精品国产亚洲精品| 亚洲最大成人中文| 变态另类丝袜制服| 国产精品永久免费网站| 午夜视频精品福利| 99国产综合亚洲精品| 国产综合懂色| 免费看a级黄色片| 国产精华一区二区三区| 亚洲国产日韩欧美精品在线观看 | 久久久久久久久久黄片| 桃色一区二区三区在线观看| 国产亚洲精品久久久久久毛片| 亚洲av电影在线进入| 99久久成人亚洲精品观看| 国产高潮美女av| 99国产精品一区二区蜜桃av| 免费在线观看日本一区| 色在线成人网| 噜噜噜噜噜久久久久久91| 国产成人啪精品午夜网站| 日韩欧美 国产精品| 九九热线精品视视频播放| 免费在线观看亚洲国产| 免费av不卡在线播放| 老司机在亚洲福利影院| 女生性感内裤真人,穿戴方法视频| 长腿黑丝高跟| 成人av在线播放网站| 国产黄片美女视频| 噜噜噜噜噜久久久久久91| 黑人欧美特级aaaaaa片| 女人高潮潮喷娇喘18禁视频| 日本 欧美在线| 高潮久久久久久久久久久不卡| 欧美一级a爱片免费观看看| 国产精品久久久av美女十八| 真人一进一出gif抽搐免费| 亚洲va日本ⅴa欧美va伊人久久| 美女高潮喷水抽搐中文字幕| 国产精品亚洲av一区麻豆| 久久国产精品影院| 91av网站免费观看| 高潮久久久久久久久久久不卡| 国产一区二区在线观看日韩 | 欧美日韩乱码在线| 怎么达到女性高潮| 亚洲精品在线观看二区| 日本 欧美在线| 99国产精品99久久久久| 香蕉av资源在线| 日本一二三区视频观看| 天堂av国产一区二区熟女人妻| 天天躁狠狠躁夜夜躁狠狠躁| 亚洲色图 男人天堂 中文字幕| 成年版毛片免费区| 一区福利在线观看| 男插女下体视频免费在线播放| 国产伦一二天堂av在线观看| 美女黄网站色视频| 欧美3d第一页| 国产一区二区三区视频了| 国产一区二区三区在线臀色熟女| 欧美3d第一页| 亚洲精品一卡2卡三卡4卡5卡| 欧美一区二区国产精品久久精品| 在线免费观看不下载黄p国产 | 黄色 视频免费看| 精品午夜福利视频在线观看一区| 亚洲av日韩精品久久久久久密| 香蕉丝袜av| а√天堂www在线а√下载| x7x7x7水蜜桃| 亚洲av成人精品一区久久| 日本三级黄在线观看| 天堂网av新在线| 白带黄色成豆腐渣| 亚洲成人中文字幕在线播放| 亚洲狠狠婷婷综合久久图片| 久久九九热精品免费| 成人性生交大片免费视频hd| 在线国产一区二区在线| 黄色 视频免费看| 99精品欧美一区二区三区四区| 亚洲五月天丁香| 美女扒开内裤让男人捅视频| 亚洲一区二区三区色噜噜| 18禁黄网站禁片免费观看直播| av在线天堂中文字幕| 午夜福利成人在线免费观看| 国产精品98久久久久久宅男小说| 日韩成人在线观看一区二区三区| 国产成人福利小说| 国产欧美日韩一区二区精品| 最近最新中文字幕大全电影3| 黄色日韩在线| АⅤ资源中文在线天堂| 欧美色视频一区免费| 亚洲在线观看片| 亚洲专区中文字幕在线| 国产午夜精品久久久久久| 成熟少妇高潮喷水视频| 久久久久国产精品人妻aⅴ院| 天天一区二区日本电影三级| 日本五十路高清| 观看美女的网站| 老司机午夜福利在线观看视频| 国产精品亚洲一级av第二区| 国产免费av片在线观看野外av| 日韩av在线大香蕉| 久久伊人香网站| 欧美日韩黄片免| 国产av不卡久久| 国产真实乱freesex| 免费观看精品视频网站| 天天躁狠狠躁夜夜躁狠狠躁| 18禁美女被吸乳视频| 精品日产1卡2卡| 免费无遮挡裸体视频| 男女床上黄色一级片免费看| 99在线视频只有这里精品首页| 欧美一级a爱片免费观看看| 欧美三级亚洲精品| 国产精品爽爽va在线观看网站| 在线看三级毛片| 国产激情偷乱视频一区二区| ponron亚洲| 国产精品女同一区二区软件 | 成人av在线播放网站| 国产免费男女视频| 在线视频色国产色| 一夜夜www| 欧美中文综合在线视频| 三级国产精品欧美在线观看 | 欧美中文综合在线视频| 国产一区二区三区视频了| av在线天堂中文字幕| 国产精品电影一区二区三区| 丰满的人妻完整版| av片东京热男人的天堂| 黑人巨大精品欧美一区二区mp4| 久久中文字幕人妻熟女| 黑人欧美特级aaaaaa片| av天堂在线播放| 国产成人精品无人区| 法律面前人人平等表现在哪些方面| 国产精品久久久久久久电影 | 国产精品久久久久久精品电影| 国模一区二区三区四区视频 | 亚洲av免费在线观看| 成年女人毛片免费观看观看9| 色老头精品视频在线观看| 久久天堂一区二区三区四区| 成人av在线播放网站| 亚洲无线观看免费| 1024香蕉在线观看| 成年女人毛片免费观看观看9| 国产毛片a区久久久久| 国产免费av片在线观看野外av| 久久久国产成人免费| 韩国av一区二区三区四区| 亚洲av免费在线观看| 美女高潮的动态| 白带黄色成豆腐渣| 一二三四社区在线视频社区8| 欧美黄色淫秽网站| 午夜视频精品福利| 小说图片视频综合网站| 波多野结衣高清作品| 热99re8久久精品国产| 岛国在线观看网站| 国产精品一及| 99精品久久久久人妻精品| 白带黄色成豆腐渣| 国产一区二区在线av高清观看| 国产亚洲欧美98| 国产精品亚洲一级av第二区| 黄色视频,在线免费观看| 国产av一区在线观看免费| 成人av一区二区三区在线看| 51午夜福利影视在线观看| av黄色大香蕉| 村上凉子中文字幕在线| 午夜精品久久久久久毛片777| 国产亚洲精品一区二区www| 最新中文字幕久久久久 | 99热这里只有是精品50| 久久欧美精品欧美久久欧美| 嫁个100分男人电影在线观看| 在线观看舔阴道视频| 久久这里只有精品中国| 一级作爱视频免费观看| 一级毛片高清免费大全| 天天躁狠狠躁夜夜躁狠狠躁| 十八禁人妻一区二区| 国产免费男女视频| 亚洲狠狠婷婷综合久久图片| 亚洲精品乱码久久久v下载方式 | 亚洲国产高清在线一区二区三| 久久精品综合一区二区三区| 人妻丰满熟妇av一区二区三区| 宅男免费午夜| 久久久久国产一级毛片高清牌| 精品电影一区二区在线| 国产精华一区二区三区| 国语自产精品视频在线第100页| 深夜精品福利| 国内久久婷婷六月综合欲色啪| av国产免费在线观看| 亚洲成a人片在线一区二区| 日韩人妻高清精品专区| 最近在线观看免费完整版| 精品国产超薄肉色丝袜足j| 嫁个100分男人电影在线观看| 亚洲成人免费电影在线观看| 桃红色精品国产亚洲av| 日本黄色视频三级网站网址| 久久天躁狠狠躁夜夜2o2o| 天堂动漫精品| 最新在线观看一区二区三区| 免费看a级黄色片| 久99久视频精品免费| 黄色 视频免费看| 一级作爱视频免费观看| 色哟哟哟哟哟哟| 青草久久国产| 在线观看66精品国产| 丝袜人妻中文字幕| 黑人巨大精品欧美一区二区mp4| 日本 欧美在线| 在线观看66精品国产| 免费看十八禁软件| 国产精品98久久久久久宅男小说| 90打野战视频偷拍视频| 法律面前人人平等表现在哪些方面| 美女大奶头视频| 中文字幕精品亚洲无线码一区| 日本熟妇午夜| 国产精品爽爽va在线观看网站| 波多野结衣巨乳人妻| 琪琪午夜伦伦电影理论片6080| 啦啦啦韩国在线观看视频| 天堂动漫精品| 真实男女啪啪啪动态图| 久久精品aⅴ一区二区三区四区| 成年女人毛片免费观看观看9| 天天躁狠狠躁夜夜躁狠狠躁| 久久草成人影院| 国产高潮美女av| av女优亚洲男人天堂 | 性色av乱码一区二区三区2| 一个人看视频在线观看www免费 | 天天躁日日操中文字幕| 婷婷亚洲欧美| 免费搜索国产男女视频| 日韩国内少妇激情av| 一个人免费在线观看电影 | 精品国产乱码久久久久久男人| netflix在线观看网站| 免费大片18禁| 香蕉久久夜色| 午夜福利免费观看在线| 精品久久久久久久久久免费视频| 黄片小视频在线播放| 高潮久久久久久久久久久不卡| 波多野结衣高清作品| 免费一级毛片在线播放高清视频| 国产精品日韩av在线免费观看| 久久久久久久久中文| 国产一区二区三区在线臀色熟女| 国产探花在线观看一区二区| 国产精品一区二区三区四区久久| 怎么达到女性高潮| 亚洲精品美女久久av网站| 日本三级黄在线观看| 色吧在线观看| 国产 一区 欧美 日韩| 长腿黑丝高跟| 美女被艹到高潮喷水动态| 草草在线视频免费看| 国产激情久久老熟女| 男女下面进入的视频免费午夜| 国产v大片淫在线免费观看| 日韩欧美 国产精品| 午夜精品久久久久久毛片777| 黄色 视频免费看| 亚洲成人久久爱视频| ponron亚洲| 免费在线观看成人毛片| 91字幕亚洲| 国产69精品久久久久777片 | 三级毛片av免费| 亚洲一区二区三区色噜噜| 18禁黄网站禁片午夜丰满| 成人国产一区最新在线观看| 免费在线观看成人毛片| 亚洲乱码一区二区免费版| 性欧美人与动物交配| 亚洲精品一区av在线观看| 色视频www国产| 国产一区二区在线观看日韩 | 两个人视频免费观看高清| 精品福利观看| 又大又爽又粗| 国产午夜福利久久久久久| 操出白浆在线播放| 99国产极品粉嫩在线观看| 成年女人毛片免费观看观看9| www日本黄色视频网| 老司机福利观看| 最新中文字幕久久久久 | 日韩中文字幕欧美一区二区| 最近在线观看免费完整版| 男女午夜视频在线观看| 成人三级做爰电影| 国产主播在线观看一区二区| 国产亚洲精品久久久com| 人人妻人人看人人澡| 18禁国产床啪视频网站| 国产1区2区3区精品| 亚洲aⅴ乱码一区二区在线播放| 国产极品精品免费视频能看的| 色视频www国产| 久久中文看片网| 9191精品国产免费久久| 久久久久久久精品吃奶| 精品一区二区三区视频在线观看免费| 老司机午夜十八禁免费视频| av国产免费在线观看| 亚洲在线观看片| 欧美日韩乱码在线| 成年女人看的毛片在线观看| 国产日本99.免费观看| 国产成人系列免费观看| 久久热在线av| 免费电影在线观看免费观看| xxx96com| 亚洲中文av在线| 老司机在亚洲福利影院| 国产欧美日韩一区二区精品| 欧美+亚洲+日韩+国产| 国产久久久一区二区三区| 日韩欧美三级三区| 午夜精品一区二区三区免费看| 哪里可以看免费的av片| 18禁黄网站禁片午夜丰满| 日本五十路高清| 首页视频小说图片口味搜索|