[HPC#] Hybridizer:GPU 上的高性能 C#

61 篇文章 5 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏
1 篇文章 0 订阅
订阅专栏

英文原文:https://developer.nvidia.com/blog/hybridizer-csharp/

  Hybridizer 是 Altimesh 的编译器,可让您通过 C# 代码或 .NET 程序集对 GPU 和其他加速器进行编程。 Hybridizer 使用修饰符号来表达并行性,生成针对多核 CPU 和 GPU 优化的源代码或二进制文件。 在这篇博文中,我们说明了 CUDA 目标。

  图 1 显示了 Hybridizer 编译流程。 使用并行化模式(例如 Parallel.For),或者像在 CUDA 中那样显式分配并行工作,您可以从加速器的计算能力中受益,而无需了解其内部架构的所有细节。 下面是一个使用 Parallel.For 和 lambda 的简单示例。在这里插入图片描述
图 1. 混合器管线

[EntryPoint]
public static void Run(double[] a, double[] b, int N)
{
    Parallel.For(0, N, i => { a[i] += b[i]; });
}

  您可以使用 NVIDIA Nsight Visual Studio Edition 在 GPU 上调试和分析此代码。 Hybridizer 实现了高级 C# 功能,包括虚拟函数和泛型。

哪里可以获得 Hybridizer

Hybridizer 有两个版本:

  • Hybridizer Software Suite(Hybridizer 软件套件):启用 CUDA、AVX、AVX2、AVX512 目标并输出源代码。 该源代码可以进行审查,这在某些业务(例如投资银行)中是强制性的。 Hybridizer 软件套件可根据要求按客户许可。

  • Hybridizer Essentials:仅启用 CUDA 目标并仅输出二进制文件。 Hybridizer Essentials 是一款免费的 Visual Studio 扩展,没有硬件限制。 您可以在 GitHub 上找到一组基本代码示例和教育材料。 这些样本还可以作为重现我们的性能结果的一种方式。

  在提供自动化默认行为的同时,Hybridizer 为开发人员提供了在每个阶段的完全控制权,允许您重用现有的特定于设备的代码、现有的外部库或自定义的手工代码片段。

调试和分析

  当使用调试信息进行编译时,您可以在 Microsoft Visual Studio 中调试 Hybridizer C# / .NET 代码,同时在目标硬件上运行优化的代码。 例如,用 C# 编写的程序可以在 Visual Studio 中命中 C# 文件中的断点,并且您可以探索驻留在 GPU 上的局部变量和对象数据。

在这里插入图片描述
图 2:使用 Hybridizer 和 NVIDIA Nsight Visual Studio 版本调试在 GPU 上运行的 C# 代码。

  您可以将 Hybridizer 集成到复杂的项目中,甚至在代码不可用或已混淆的库中,因为 Hybridizer 在 MSIL 字节码上运行。 我们在关于使用 Hybridizer 加速 AForge 图像处理库而不修改库的 博客文章中展示了这种能力。 在 MSIL 字节码上运行还可以支持构建在 .Net 虚拟机之上的各种语言,例如 VB.Net 和 F#。

  所有这些灵活性并不以性能损失为代价。 正如我们的基准测试所示,Hybridizer 生成的代码可以与手写代码一样执行。 您可以使用 NVIDIA Nsight 和 NVIDIA Visual Profiler 等性能分析器来测量生成的二进制文件的性能,性能指标参考原始源代码(例如 C#)。

一个简单的例子:Mandelbrot

  作为第一个示例,我们演示了在 NVIDIA GeForce GTX 1080 Ti GPU(Pascal 架构;计算能力 6.1)上运行的 Mandelbrot 分形的渲染。

Mandelbrot C# 代码

  以下代码片段显示了纯 C#。 它在 CPU 上运行平稳,没有任何性能损失,因为大多数代码修改都是属性(例如 Run 方法上的 EntryPoint 属性),这些属性在运行时没有任何影响。

[EntryPoint]
public static void Run(float[,] result)
{
    int size = result.GetLength(0);
    Parallel2D.For(0, size, 0, size, (i, j) => {
        float x = fromX + i * h;
        float y = fromY + j * h;
        result[i, j] = IterCount(x, y);
    });
}

public static float IterCount(float cx, float cy)
{
    float result = 0.0F;
    float x = 0.0f, y = 0.0f, xx = 0.0f, yy = 0.0f;
    while (xx + yy <= 4.0f && result < maxiter) {
        xx = x * x;
        yy = y * y;
        float xtmp = xx - yy + cx;
        y = 2.0f * x * y + cy;
        x = xtmp;
        result++;
    }
    return result;
}

  EntryPoint 属性告诉 Hybridizer 生成 CUDA 内核。 多维数组映射到内部类型,而 Parallel2D.For 映射到 2D 执行网格。 给定几行样板代码,我们在 GPU 上透明地运行此代码。

float[,] result = new float[N,N];
HybRunner runner = HybRunner.Cuda("Mandelbrot_CUDA.dll").SetDistrib(32, 32, 16, 16, 1, 0);
dynamic wrapper = runner.Wrap(new Program());
wrapper.Run(result);
分析

  我们使用 Nvidia Nsight Visual Studio Edition 分析器分析了此代码。 C# 代码链接到 CUDA 源视图中的 PTX,如图 3 所示。

在这里插入图片描述
图 3. 在 CUDA 源视图中分析 Mandelbrot C# 代码。

分析器允许进行与 CUDA C++ 代码相同级别的调查。

  至于性能,此示例达到峰值计算 FLOP/s 的 72.5%。 这是 83% 的相同代码,用 CUDA C++ 手写。

在这里插入图片描述
图 4:Profiler 输出显示 GPU 利用率和 Mandelbrot 代码在 GPU 上的执行效率。 它的效率几乎与手写 CUDA C++ 代码一样好。

使用 Hybridizer 提供的扩展控制可以从 C# 代码获得更好的性能。 如以下代码所示,语法与 CUDA C++ 非常相似。

[EntryPoint]
public static void Run(float[] result)
{
    for (int i = threadIdx.y + blockIdx.y * blockDim.y; i < N; i += blockDim.y * gridDim.y)
    {
        for (int j = threadIdx.x + blockIdx.x * blockDim.x; j < N; j += blockDim.x * gridDim.x)
        {
            float x = fromX + i * h;
            float y = fromY + j * h;
            result[i * N + j] = IterCount(x, y);
        }
    }
}

  在这种情况下,生成的代码和手写的 CUDA C++ 代码执行相同,并达到峰值 FLOP/s 的 87%,如图 5 所示。

在这里插入图片描述
图 5:分析手动优化的 Mandelbrot C# 代码。

泛型和虚函数

  Hybridizer 支持设备函数中的泛型和虚函数调用。 现代编程语言的这些基本概念促进了代码模块化并提高了表达能力。 然而,C# 中的类型解析是在运行时完成的,这会带来一些性能损失。 .NET 泛型可以在保持灵活性的同时实现更高的性能:Hybridizer 将泛型映射到 C++ 模板,这些模板在编译时解析,从而允许函数内联和过程间优化。 另一方面,虚函数调用被映射到注册了实例方法的虚函数表。

  模板实例化提示通过两个属性 HybridTemplateConcept 和 HybridRegisterTemplate (触发设备代码中的实际模板实例化)提供给 Hybridizer。 作为示例,让我们看一下两个版本的简单流基准测试,一个使用虚拟函数调用,另一个使用模板映射。 该基准测试依赖于公开下标运算符的通用接口 IMyArray:

[HybridTemplateConcept]
public interface IMyArray {

    double this[int index] { get; set; }
}

这些操作符必须与设备功能“混合”。 为此,我们将 Kernel 属性放入实现类中。

public class MyArray : IMyArray {
    double[] _data;

    public MyArray(double[] data) {
        _data = data;
    }

    [Kernel]
    public double this[int index] {
        get { return _data[index]; }
        set { _data[index] = value; }
    }
}

虚函数调用

在第一个版本中,我们使用接口编写流算法,没有向编译器提供进一步提示。

public class MyAlgorithmDispatch {
    IMyArray a, b;

    public MyAlgorithmDispatch(IMyArray a, IMyArray b)  {
        this.a = a;
        this.b = b;
    }

    [Kernel]
    public void Add(int n) {
        IMyArray a = this.a;
        IMyArray b = this.b;
        for (int k = threadIdx.x + blockDim.x * blockIdx.x; 
             k < n; 
             k += blockDim.x * gridDim.x) {
            a[k] += b[k];
        }
    }
}

由于我们在被视为接口的 a 和 b 上调用下标运算符,因此我们在 MSIL 中有一个 callvirt。

IL_002a: ldloc.3
IL_002b: ldloc.s 4
IL_002d: callvirt instance float64 Mandelbrot.IMyArray::get_Item(int32)
IL_0032: ldloc.1
IL_0033: ldloc.2
IL_0034: callvirt instance float64 Mandelbrot.IMyArray::get_Item(int32)
IL_0039: add
IL_003a: callvirt instance void Mandelbrot.IMyArray::set_Item(int32, float64)

检查生成的二进制文件显示 Hybridizer 在虚拟函数表中生成了一个查找,如图 6 所示。

在这里插入图片描述
图 6. PTX 中的虚拟函数调用。

  该版本的算法消耗 32 个寄存器并实现 271 GB/s 的带宽,如图 7 所示。 在相同的硬件上,CUDA 工具包中的带宽测试示例达到 352 GB/s。

在这里插入图片描述
虚函数表会导致更多的寄存器压力,并阻止内联。

泛型调用

我们用泛型编写了第二个版本,要求 Hybridizer 生成模板代码。

[HybridRegisterTemplate(Specialize = typeof(MyAlgorithm))]
public class MyAlgorithm where T : IMyArray
{
    T a, b;

    [Kernel]
    public void Add(int n)
    {
            T a = this.a;
            T b = this.b;
            for (int k = threadIdx.x + blockDim.x * blockIdx.x; 
                 k < n; 
                 k += blockDim.x * gridDim.x)
               a[k] += b[k];
            }
    }

    public MyAlgorithm(T a, T b)
    {
            this.a = a;
            this.b = b;
    }
}

通过 RegisterTemplate 属性,Hybridizer 生成适当的模板实例。 然后优化器内联函数调用,如图 8 所示。

在这里插入图片描述
图 8. 使用泛型参数生成内联函数调用,而不是虚拟函数表查找。

通用参数的性能要好得多,达到了 339 GB/s,性能提升了 25%(图 9),带宽测试达到了 96%。

在这里插入图片描述

开始使用Hybridizer

  Hybridizer 支持多种 C# 功能,允许代码分解和表达能力。 Visual Studio 和 Nsight(调试器和分析器)内的集成为您提供了一个安全且高效的开发环境。 即使在非常复杂、高度定制的代码上,Hybridizer 也能实现出色的 GPU 性能。

您可以从 Visual Studio Marketplace 下载 Hybridizer Essentials。 在 github 上查看我们的 SDK。

C#实现获取GPU显卡信息​(附完整源码)
希望我的博客,能帮上你解决学习中工作中所遇到的问题
04-04 314
C#实现获取GPU显卡信息​(附完整源码)
c#视觉应用开发中如何在C#中使用GPU加速图像处理?
最新发布
zhangzhechun的专栏
07-17 209
通过使用Emgu CV和CUDA,你可以大幅度提升图像处理的性能。上述示例展示了如何在C#中使用GPU加速进行高斯模糊、边缘检测、图像缩放和阈值处理等操作。你可以根据项目需求,选择适合的CUDA加速算法来优化你的图像处理任务。使用CUDA进行图像处理不仅可以加速执行,还可以处理更大、更复杂的图像数据,这对于实时图像处理和计算机视觉应用尤为重要。希望这些示例代码能帮助你更好地理解如何在C#中利用GPU加速图像处理。
使用C#来面向GPU编程
cpongo5
01-01 1564
一直以来,我们都在使用NVIDIA的CUDA平台编写通用程序来发挥NVIDIA GPU的计算性能优势。尽管CUDA支持不同的编程语言,但是编写高性能的代码通常需要使用C或者C++。许多开发者为了编写面向GPU的代码,不得不放弃使用他们更喜欢的编程语言。直到最近,C#开发者终于可以摆脱这种困境了。\\Altimesh推出的新编译工具——Hybridizer,通过为C#开发者提供一种新的编译方法来解决...
.NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
weixin_30239339的博客
11-28 311
前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全、高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了。C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的安全保障,即什么都不用担心;那如果我们需要操作的数据不在托管内存中,而是来自于非托管内存,比如位于本机内存或者堆栈...
HPCsharp:C#中的高性能算法:SIMDSSE,多核和更快
02-04
如果您喜欢HPCsharp,请给它加星,并捐赠以帮助我们吸引更多好东西来。 给我们反馈,让我们知道还有哪些地方可以使用其他性能。 C#中的高性能计算(HPCsharp) 高性能C#通用算法。 在Windows和Linux上运行。 社区推动提高C#性能。 熟悉的接口,类似于标准C#算法和Linq。 免费,开源,位于nuget.org上 算法 * ** 上证所 多核 数组 清单 细节 2 14 :check_mark: :check_mark: :check_mark: 按元素添加两个数组 1个 2 :check_mark: :check_mark: 通用IComparer <T> 4 5 :check_mark: 泛型 1个 11 :check_mark: :check_mark: :check_mark: :check_mark: L
C#超级计算机
11-27
C#编写的超级计算机,能够完成计算机的各个功能
隐式格式的MATLAB代码-geo-hpc-course:并行CPU和GPU高性能计算-短期课程
05-22
并行CPU和GPU高性能计算课程 本短期课程旨在以动手实践的形式为Julia中的并行和高性能计算提供一种交互式的应用方法。 这门简短的课程涵盖了现代地理计算中的流行领域。 寻求微分方程的解需要有效利用现代硬件的有效...
hpc-novice:高性能计算新手介绍
05-10
高性能计算(High Performance Computing, HPC)是计算机科学的一个重要领域,主要涉及使用并行处理技术和大规模计算资源来解决复杂问题。HPC系统通常由多台计算机组成,通过高速网络连接形成集群,从而提供远超单台...
pagerankmatlab代码-HPC-lab:高性能计算实验室
06-07
讲座“HPC 实验室”的代码解决方案。 参与项目: 1. Cache optimization, Intel Intrinsics 2. OpenMP 3. MPI; OpenMPI 4. MATLAB 5. Partial Differential Equations, Finite Differences 6. Distributed PageRank ...
SharpText:用C#实现的GPU加速文本渲染器
04-24
夏普 免责声明:该项目正在进行中,很可能会出现错误(但从目前为止的经验来看,它似乎确实可以正常工作)。 随时尝试一下,请提出任何错误或功能请求,作为此仓库中的一个问题。 我很乐意查看任何PR进行的此类改进。 描述 这是用C#实现的GPU加速的文本渲染器。 它实现了的出色技术(感谢Evan详细解释了该技术如何工作并提供示例代码:))。 它包括几个步骤: 读取任何受支持格式的字体文件(我选择了库,因为它具有.NET Standard支持) 将直线和贝塞尔曲线转换为一组可以渲染的三角形 将三角形渲染到渲染目标 使用渲染目标作为输入运行另一遍,渲染最终文本并执行亚像素抗锯齿 当我将任何平台/实现特定的代码分离到不同的项目中时,它应该可以在渲染平台之间重用。 目前,项目结构如下: SharpText.Core-包含共享的逻辑和平台无关的代码 SharpText.Veldrid-为Veldri
C#调用GPU计算案例
07-29
使用C#调用CUDA的DLL链接库实现GPU计算的一个小案例,具体步骤参考地址:http://go.boselor.com/fwlink?id=12
使用GPU对C语言代码进行加速_c语言代码大全和详细解释
12-07
使用GPU对C语言代码进行加速,其中以规则匹配为例,优化后的方法为:特征规则使用acbm算法编译成一个ptree、ptree匹配使用cuda编程在GPU运行、多个packet并发匹配,处理速度提升数倍。
Fractal-Viewer:C#Windows窗体中的分形查看器具有gpu加速和高度可定制性
03-10
Fractal-Viewer:C#Windows窗体中的分形查看器具有gpu加速和高度可定制性
多服务器并行计算平台 C#原代码(模拟超级计算机)源代码
04-06
多服务器并行计算平台 C#原代码(模拟超级计算机)源代码 多服务器并行计算平台 C#原代码(模拟超级计算机),通过.net remoting方式和数据分片技术,只需一定数量服务器或PC和连接网线和100口交换机组网即可支持100台服务器或PC做并行计算,数据在每台服务器或PC上分包计算后结果汇总到管理终端,可模拟核爆炸和天气预报等需要巨大计算力的工作,在此原代码的基础上稍作修改可做为需大计算力的工程的并行计算平台。
高性能计算(HPC)-一文全面理解高性能计算
发狂的小花的博客
12-28 4046
AI的疯狂发展以及视频、图像、音频、3D数据的迫切需要,导致传统的CPU不能满足这样大算力的计算。由于这些数据的运算多是一些简单的运算,因此需要设计出多个算术运算单元的芯片来应对这种少控制多计算的场景。这是并行计算、高性能计算诞生的重要动力。为了适配这样的场景,设计出了以GPU为核心的并行处理芯片、包括DSP、VPU、DPU、NPU等。本文主要介绍基于这些芯片以及网络、系统引入的高性能计算,比较全面的介绍高性能计算,希望对高性能计算的理解起到一个宏观的作用。🎬:一个全栈工程师的升级之路!
学习DOTS之High Performance C# (HPC#)
蛰伏--当你不够强大时,就不要放弃努力
03-15 1481
学习DOTS之High Performance C# (HPC#)
c#语言利用GPU进行加速计算
zhangzhechun的专栏
03-31 2942
在上面的代码中,我们首先初始化了一个CUDA上下文,并加载了一个名为MyKernel的CUDA核函数。接着,在Calculate方法中,我们将输入数据和输出数据复制到设备内存中,并设置CUDA核函数的参数。最后,我们将结果从设备内存复制到主机内存中,并释放设备内存。在上面的示例代码中,我们使用了ManagedCuda库来与CUDA进行交互。这个库提供了C#封装的CUDA API,让我们能够在C#中方便地使用CUDA进行加速计算。首先,你需要在你的计算机上安装CUDA并配置好CUDA的开发环境。
新版 C# 高效率编程指南
寒冰屋的专栏
07-12 43
新版 C# 高效率编程指南
HPC China2011:高性能云计算的未来展望
高性能计算与云计算的结合,正是看到了这种趋势,即通过互联网将大规模计算能力提供给用户,使得高性能计算不再局限于大型科研机构或超算中心,而是可以被广泛的企业和个人所使用。 云环境下的高性能计算能够提供...
写文章

热门文章

  • [C#] C#中的指针 26461
  • [Unity] Unity Sprites:SpriteRenderer 与 CanvasRenderer(UI 图像) 5363
  • 面向数据编程 Data-Oriented Programming [1] 5195
  • [Unity Mirror] 入门 4835
  • [Unity] 创建网格顶点和三角形 4710

分类专栏

  • 性能优化 27篇
  • c# 61篇
  • 内存 20篇
  • Unity 246篇
  • 单元测试 1篇
  • 多线程 5篇
  • Job system 2篇
  • HPC# 2篇
  • burst 1篇
  • ECS 63篇
  • Burst compiler 1篇
  • Shader 56篇
  • 人工智能 17篇
  • GameDesign 1篇
  • 游戏写作 3篇
  • AIGC 25篇
  • 数学 4篇
  • Opsive 11篇
  • ultimate inventory system 11篇
  • python 6篇
  • Omniverse 5篇
  • CUDA 1篇
  • Mirror 81篇
  • Unity 架构 1篇
  • opengl 18篇
  • .net依赖注入 12篇
  • 函数式编程 38篇
  • URP 11篇
  • 分析 2篇
  • Crashlytics 1篇
  • 崩溃 1篇
  • Addressable 9篇
  • Unity Workflows 11篇
  • 面向数据编程 27篇
  • UI 1篇
  • 安全 1篇
  • 数据 1篇
  • Entitas 10篇
  • 文档规则建议 1篇
  • OpenCL 4篇
  • 网络 1篇
  • c++ 7篇
  • IL2CPP 3篇
  • Native Container 3篇
  • .net函数式编程 1篇
  • License 1篇
  • 笔记

最新评论

  • [Unity ECS] 连接实体或实体的关系

    SamuelZon: dots中没有了父子关系,setEnable的时候想隐藏后显示啥的挺麻烦

  • [AIGC] Stable Diffusion 采样器:综合指南

    星星帮我关下月亮: 还有什么值得关注的参数呢?如何在质量和生成速度中找一个平衡点呢,求新帖

  • [Unity Sentis] 使用 Hugging Face Transformers 和 Unity Sentis 创建 AI 机器人 NPC

    朽石Biubiubiu: 好像不支持中文

  • [AIGC] Stable Diffusion 采样器:综合指南

    烟雨星空: 收敛是什么意思?

  • [Unity Mirror] 权威

    极端自闭: 你是在阴阳他吗

最新文章

  • [C#] Foreach 循环还会产生垃圾吗?
  • [C#] C# String.Format() 和 StringBuilder
  • [C#] 何时在 .NET Core 中使用 String 与 StringBuilder
2024
04月 15篇
03月 6篇
02月 23篇
01月 30篇
2023年49篇
2022年211篇
2021年138篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王网站建设推广优化海口网站内容优化寿光网站优化网站怎么优化碳云速捷选择网站需要做什么优化中原区一站式网站搭建优化兴山宜昌网站建设优化公司潜江市网站关键词优化价格延津一站式网站搭建优化聊城茌平网站优化优化网站的有哪些百度seo网站优化公司马鞍山市百度网站优化价格网站优化策划方案河南靠谱网站优化价格网站优化三条原则云浮网站关键词排名优化多少钱成都专业网站seo如何优化黄冈工厂网站优化哪家好锦江区网站制作优化咸阳优化网站排名舞钢百度seo网站优化奎屯企业网站优化长春网站优化排行美容行业网站优化营销珠海企业网站优化怎么做朔州网站优化系统美容网站优化湖州市网站优化优化网站流程详解香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化