AMD Instinct™ MI200 GPU内存空间概述

news2024/11/6 3:12:26

AMD Instinct™ MI200 GPU memory space overview — ROCm Blogs

注意: 本博客之前是 AMD实验室笔记博客系列的一部分。

HIP API 支持在加速系统上为主机和设备内存提供多种分配方式。在本文中,我们将:
1. 介绍一组常用的内存空间
2. 识别每种内存空间的独特之处
3. 讨论每种空间的一些常见用例
我们主要关注AMD的MI200系列GPU,但本文讨论的许多概念也适用于其他GPU和API。

内存空间类型

在异构的加速系统上工作意味着存在不同的内存和执行空间。在管理内存时需要特别小心,以确保数据在正确的时间出现在正确的位置。尽管在HIP中有许多不同类型的内存分配器和选项,但在AMD的MI200上,它们都是以下三种属性的组合:

1. 主机内存 vs 设备内存
    - 主机内存存在于机器的主机(例如CPU)上,通常在随机存取存储器(RAM)中。
    - 设备内存存在于连接到主机的设备或加速器(例如GPU)上。在GPU的情况下,这种内存位于视频随机存取存储器(VRAM)中,最近的GPU架构通常是以下两种之一:
        - 图形双倍数据速率(GDDR)同步动态随机存取存储器(SDRAM) - 例如AMD RDNA™ 2 GPU上的GDDR6
        - 高带宽内存(HBM) - 例如AMD的MI200 GPU上的HBM2e

2. 可分页 vs 固定(主机)内存
    - 可分页内存是我们通常在C++应用程序中调用`malloc`或`new`时获得的内存。可分页内存的独特之处在于它存在于“页”(内存块)中,可以迁移到其他内存存储。例如在主板上的CPU插槽之间迁移内存,或者当系统耗尽RAM空间时,将部分RAM页转储到硬盘的交换分区中。
    - 固定内存(或页面锁定内存)存储在锁定到RAM中特定扇区的页面中,不能迁移。

3. 粗粒度一致性 vs 细粒度一致性
    - 粗粒度一致性意味着仅在内核边界处认为内存是最新的,可以通过`hipDeviceSynchronize`、`hipStreamSynchronize`或任何作用于空流(如`hipMemcpy`)的阻塞操作来强制执行。例如,可缓存内存是一种粗粒度内存,其中数据的最新副本可以存储在其他地方(例如L2缓存)。
    - 细粒度一致性意味着在CPU/GPU内核运行时支持一致性。如果主机和设备在使用系统范围的原子操作(例如更新缓冲区的错误码或标志)时操作相同的数据空间,这可能很有用。细粒度内存意味着无论如前所述的内核边界,最新数据都可见。

这些内存属性并不是相互排斥的,这会导致一些复杂性,我们将尝试澄清。

在了解HIP API如何与这些空间协作之前,我们需要介绍一些关于MI210、MI250和MI250X GPU的重要细节。MI210 GPU 是一个标准的PCIe-4.0 x16卡,包含了一个图形计算芯片(GCD),配有64GB的板载HBM2e内存。MI250和MI250X GPU是OCP加速模块(OAMs),由两个GCD组成,总内存为128GB,但在软件上呈现为两个独立的设备,每个设备有64GB VRAM。在本文中,我们将使用“GPU”一词指整个GPU,当GPU和GCD之间的区别很重要时,则使用“GCD”。

在以下部分中,我们将介绍用于HIP中各种内存空间的分配器和释放器。 

可分页内存

在 HIP 中使用标准分配器和释放器来分配和释放可分页的主机内存:

template<typename T>
T *
allocateHost_Pageable(const size_t size)
{
  return new T[size];
}

template<typename T>
void
deallocateHost_Pageable(T * ptr)
{
  delete [] ptr;
}

请注意,我们可以调整可分页内存的对齐以提高与 GPU 配合时的性能,不过我们将在未来的博客文章中讨论。默认情况下,可分页内存无法从设备访问,但在接下来的章节中,我们将介绍[注册可分页内存](AMD Instinct™ MI200 GPU memory space overview — ROCm Blogs)和[启用页面迁移](AMD Instinct™ MI200 GPU memory space overview — ROCm Blogs),这两者可以绕过这一限制。 

非分页(固定)内存

非分页内存(又称固定内存或页锁定内存)是主机内存,它被映射到所有GPU的地址空间中,这意味着指针可以在主机和设备上使用。在设备内核中访问驻留在主机的固定内存通常不推荐用于性能,因为这可能会迫使数据穿越主机-设备互连(例如PCIe),这比设备上的带宽要慢得多(在MI200上慢超过40倍)。

固定主机内存可以通过以下两种一致性支持类型之一进行分配:

1. hipHostMallocCoherent
    ◦ 一致的固定内存(又称为零拷贝访问内存)意味着主机内存不会在GPU上被本地缓存,这意味着细粒度的一致性。
    ◦ 细粒度的一致性意味着CPU可以在内核在GPU上使用数据时访问分配中的最新数据。

2. hipHostMallocNonCoherent
    ◦ 非一致的固定内存意味着GPU在使用过程中可以自由地将主机数据本地存储在MI200的L2缓存中。
    ◦ 在内核在设备上运行期间,主机可能无法看到最新的数据分配,必须等待内核完成或缓存被刷新后(例如通过设备或流同步调用)才能看到最新数据。

默认情况下,固定内存分配是一致内存(`hipHostMallocDefault`)。在HIP中还有其他固定内存标志(例如,`hipHostMallocMapped`和`hipHostMallocPortable`),但是对于MI200,这些选项(开或关)不影响性能,因此我们将忽略它们。更多关于固定内存分配标志的信息可以参见HIP编程指南。使用上述标志通过`hipHostMalloc`调用可以控制分配一致和非一致内存:

template<typename T>
T *
allocateHost_PinnedCoherent(const size_t size)
{
  void * ptr;
  HIP_CHECK_ERROR(hipHostMalloc(&ptr, size*sizeof(T), hipHostMallocCoherent));
  return reinterpret_cast<T*>(ptr);
}

template<typename T>
T *
allocateHost_PinnedNonCoherent(const size_t size)
{
  void * ptr;
  HIP_CHECK_ERROR(hipHostMalloc(&ptr, size*sizeof(T), hipHostMallocNonCoherent));
  return reinterpret_cast<T*>(ptr);
}

template<typename T>
void
deallocateHost_Pinned(T * ptr)
{
  HIP_CHECK_ERROR(hipHostFree((void*)ptr));
}

就像通过设置亲和性(例如通过`taskset`)将进程锁定到CPU核心一样,固定内存分配器可以对内存存储系统进行类似的操作。在多插槽系统上,确保固定内存位于与拥有进程相同的插槽上非常重要,否则每条缓存行将通过CPU-CPU互连移动,从而增加延迟并可能降低带宽。
在实际操作中,固定内存(无论是一致还是非一致)用于改善主机和设备之间的传输时间。对于传输操作,例如`hipMemcpy`或`hipMemcpyAsync`,在主机上使用固定内存而不是分页内存可以带来约3倍的带宽提升。 

注册的可分页内存

注册的可分页内存,顾名思义,是一种通过将可分页内存注册到GPU上,使其可以被设备内核直接访问的方法。注册确保了GPU能够识别主机指针,从而**有效地**将可分页分配转换为固定分配内存。

要分配注册内存,必须首先分配可分页内存,然后将其注册到当前活动的GPU。

template<typename T>
T *
allocateHost_Registered(size_t size,
                        const int device_id)
{
  T * ptr = allocateHost_Pageable<T>(size);
  HIP_CHECK_ERROR(hipSetDevice(device_id));
  HIP_CHECK_ERROR(hipHostRegister((void*)ptr, size*sizeof(T), hipHostRegisterDefault));
  return ptr;
}

template<typename T>
void
deallocateHost_Registered(T * ptr)
{
  HIP_CHECK_ERROR(hipHostUnregister((void*)ptr));
  delete [] ptr;
}

虽然这种注册将主机数据映射到设备,但这并不一定意味着正在运行的内核可以使用现有的主机指针。相反,可以根据主机指针检索注册的设备指针:

template<typename T>
T *
getRegisteredDevicePtr(T * host_ptr)
{
  void * dev_ptr;
  HIP_CHECK_ERROR(hipHostGetDevicePointer(&dev_ptr, host_ptr, 0));
  return reinterpret_cast<T*>(dev_ptr);
}

注册可分页内存的目的是确保数据可以从GPU访问和修改。注册的内存被视为`hipHostMallocCoherent`固定内存,性能相当。注册可分页内存的主要原因是在开发人员无法控制给定分配的分配器的情况下,但仍然需要在设备上访问该内存。

托管内存 (Managed memory)

托管内存 (Managed memory) 是指 MI200 系列 GPU 上可用的统一内存。这种内存类似于 hipHostMallocCoherent 锁页内存,可以在主机和设备之间共享一个指针,并且(默认情况下)支持细粒度的一致性。然而,托管内存还可以在主机和设备之间自动迁移页。

并非所有系统都支持托管内存,因此建议在代码中添加一个托管内存可用性检查:

bool
managedMemoryEnabled(const int device_id)
{
  int managed_memory = 0;
  HIP_CHECK_ERROR(hipDeviceGetAttribute(&managed_memory, hipDeviceAttributeManagedMemory, device_id));
  return managed_memory != 0;
}

使用 AMD 的 MI200 系列 GPU 构建的系统通常支持托管内存,但也有一些注意事项,我们可以在 [此处](AMD Instinct™ MI200 GPU memory space overview — ROCm Blogs) 阅读到更多相关信息。分配托管内存使用 hipMallocManaged

template<typename T>
T *
allocateManaged(size_t size,
                const int device_id)
{
  if(!managedMemoryEnabled(device_id))
    throw std::logic_error("ERROR: Managed memory is not available on this device.");

  HIP_CHECK_ERROR(hipSetDevice(device_id));
  void * ptr;
  HIP_CHECK_ERROR(hipMallocManaged((void**)&ptr, size * sizeof(T)));
  return reinterpret_cast<T*>(ptr);
}

template<typename T>
void
deallocateManaged(T * ptr)
{
  HIP_CHECK_ERROR(hipFree((void*)ptr));
}

HIP 支持其他一些与页迁移相关的调用,例如优先化内存位置(`hipMemAdvise`)、预取数据到设备/主机(`hipMemPrefetchAsync`)以及获取内存位置信息(`hipMemRangeGetAttribute`)。我们会在未来的博客中详细研究托管内存和页迁移。目前,请参阅 [更多资源](AMD Instinct™ MI200 GPU memory space overview — ROCm Blogs)。

托管内存在希望HIP能够根据需求自动在主机和设备之间传输数据所有权的情况下使用,从而简化用户的内存管理。这种内存空间显著地简化了从CPU负载迁移到GPU负载的过程。

设备内存

设备内存只是分配在特定设备上的内存。与固定的主机内存类似,设备内存可以分配为细粒度或粗粒度。出于性能原因,我们通常不想限制设备上数据的可缓存性,因此设备分配器 hipMalloc 返回的是粗粒度内存:

template<typename T>
T *
allocateDevice(const size_t size,
               const int device_id)
{
  HIP_CHECK_ERROR(hipSetDevice(device_id));
  void * ptr;
  HIP_CHECK_ERROR(hipMalloc(&ptr, size*sizeof(T)));
  return reinterpret_cast<T*>(ptr);
}

template<typename T>
void
deallocateDevice(T * ptr)
{
  HIP_CHECK_ERROR(hipFree((void*)ptr));
}

另外,我们可以在支持的系统上使用带有 hipDeviceMallocFinegrained 标志的扩展 malloc 调用 hipExtMallocWithFlags 来分配细粒度内存。CPU 和 GPU 上粗粒度和细粒度内存的支持情况可以在 rocminfo 的“Pool Info”部分找到。在以下示例中,可以看到 CPU 有可用的粗粒度和细粒度内存池,而 GPU 仅限于粗粒度内存:

$ rocminfo
...
*******
Agent 1
*******
  Name:                    AMD EPYC 7742 64-Core Processor
...
  Pool Info:
    Pool 1
      Segment:                 GLOBAL; FLAGS: FINE GRAINED
...
    Pool 3
      Segment:                 GLOBAL; FLAGS: COARSE GRAINED
...
*******
Agent 9
*******
  Name:                    gfx90a
...
  Pool Info:
    Pool 1
      Segment:                 GLOBAL; FLAGS: COARSE GRAINED
...

默认情况下,`hipMalloc` 和 hipFree 是阻塞调用,但是,HIP 最近添加了非阻塞版本 hipMallocAsync 和 hipFreeAsync,它们接收一个流作为额外参数。
设备内存应尽可能使用。设备内存不仅比访问设备上的主机内存性能高得多,而且还可以更好地控制内存在系统中的位置。

提高传输带宽

在大多数情况下,HIP默认的行为是将数据从固定的主机分配传输到设备上,这通常会达到互连的带宽上限。然而,在某些情况下,互连并不是瓶颈。为了理解这一点,我们将讨论GPU如何将内存从主机分配传输到设备以及从设备传输到主机。

将数据传输到MI200(或从MI200传输数据)的主要方式是使用机载系统直接内存访问(SDMA)引擎,它用于将内存块传输到设备外部的互连(包括GPU-CPU或GPU-GPU)。每个MI200 GCD都有一个独立的SDMA引擎用于主机到设备和设备到主机的内存传输。重要的是,SDMA引擎是独立于计算基础设施的,这意味着内存传输到/从设备不会影响内核的计算性能,但它们确实会在一定程度上影响内存带宽。SDMA引擎主要针对PCIe-4.0 x16进行了调优,这意味着它们的设计带宽可达32 GB/s。

ORNL(橡树岭国家实验室)的Frontier超级计算机使用的MI250X平台的一个重要功能是主机和设备之间的Infinity Fabric™互连。Infinity Fabric互连比标准的PCIe-4.0有更好的性能支持(通常约高出50%的带宽);然而,由于SDMA引擎不以这种速度运行,因此它不会最大化更快互连的带宽。

我们可以通过绕过SDMA引擎并用一种称为“Blit”内核的复制内核来解决这种带宽限制。Blit内核将使用GPU上的计算单元,从而消耗计算资源,这可能并不总是有利的。启用Blit内核的最简单方法是设置环境变量 HSA_ENABLE_SDMA=0,这将禁用SDMA引擎。在GPU使用PCIe互连而不是Infinity Fabric互连的系统上,Blit内核不会影响带宽,但仍会消耗计算资源。使用SDMA与Blit内核也适用于MPI数据传输和GPU-GPU传输,但我们将在未来的博客文章中讨论这种情况。

启用页面迁移

在MI200 GPU上,有一个选项可以自动在主机和设备之间迁移内存页面。这对于托管内存来说非常重要,因为数据的局部性对性能很重要。根据系统的不同,页面迁移可能默认是禁用的,在这种情况下,托管内存将像固定的主机内存一样运行,并且性能会受到影响。

启用页面迁移允许GPU(或主机)在页面错误(通常是内存访问错误)发生后重新尝试,而是检索丢失的页面。在MI200平台上,我们可以通过设置环境变量`HSA_XNACK=1`来启用页面迁移。虽然这个环境变量在内核运行时启用页面迁移是必须的,但在编译时启用这个环境变量也很有帮助,因为它可以改变任何编译内核的性能。

要检查页面迁移是否在MI200平台上可用,我们可以在Linux终端中使用`rocminfo`命令:

$ rocminfo | grep xnack
      Name:                    amdgcn-amd-amdhsa--gfx90a:sramecc+:xnack-

这里,`xnack-`表示XNACK是可用的但默认情况下是禁用的。启用XNACK会得到预期结果:

$ HSA_XNACK=1 rocminfo | grep xnack
      Name:                    amdgcn-amd-amdhsa--gfx90a:sramecc+:xnack+

同样需要注意的是,启用页面迁移还会影响可分页的主机内存,这意味着它将自动按需迁移到GPU。如果你禁用XNACK,并尝试在设备上使用可分页内存,会导致未定义行为(例如段错误和无效指针错误代码)。页面迁移并不总是可用的——例如在AMD RDNA™ 2 GPU上或在不支持异构内存管理(HMM)的操作系统上。

总结

我们探讨了在AMD MI200平台上常用的一组内存空间,并介绍了每种内存空间的分配和释放方式,以及其设计目的。我们还讨论了在某些MI250X平台上,如何使用SDMA引擎可能限制带宽,以及如何启用页迁移显著提高管理内存的性能。以下是一些在MI200系统上使用各种内存空间的简单建议和注意事项:

一些建议:

1. 如果应用程序需要在设备和主机之间来回移动数据(单独分配),请在主机端使用固定内存。
2. 如果应用程序需要在主机和设备上定期使用数据,不想处理单独的分配,并且不担心耗尽MI200 GPU上的最大VRAM(每个GCD 64 GB),请使用管理内存。
3. 如果使用的是MI250X系统(例如,ORNL的Frontier超级计算机),请检查关闭SDMA是否会改善主机-设备和MPI数据传输的性能。
4. 如果管理内存性能较差,请检查系统是否支持管理内存以及是否启用了页迁移(XNACK)。

一些注意事项:

1. 如果你想在MI200上利用页迁移,请使用管理内存。虽然可分页内存会正确迁移,但它不是一个便携的解决方案,如果未对齐页面,还可能存在性能问题。
2. 设计算法时,尽量避免主机-设备内存一致性(例如,系统范围原子操作)。虽然在非常特定的情况下它会是一个有用的功能,但并非所有系统都支持,并且引入主机-设备互连瓶颈会对性能产生负面影响。

本博客是对MI200上内存空间的高度概述,我们计划在后续文章中深入探讨管理内存、原子操作、内存一致性和性能。

其他资源:

- [HIP编程指南]
- [ENCCS AMD节点内存模型]
- [Crusher快速入门指南]
- [异构内存管理(HMM)]

如果您有任何问题或评论,请在GitHub讨论页面联系我们:[讨论]

AMD, AMD Instinct, RDNA, Infinity Fabric 及其组合是Advanced Micro Devices, Inc.的商标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes强制删除terminating状态的namespace

Kubernetes中的Namespace处于Terminating状态并且常规删除不起作用。 1.Namespace长时间处于Terminating状态往往是因为某些finalizers阻止了它的删除。 kubectl get namespace <namespace-name> -o json > namespace.json 2.编辑生成的 namespace.json文件&#xff…

今日指数项目A股大盘数据采集

1、A股大盘数据采集 1.1 A股大盘数据采集准备 1.1.1 配置ID生成器bean A股大盘数据采集入库时&#xff0c;主键ID保证唯一&#xff0c;所以在stock_job工程配置ID生成器&#xff1a; Configuration public class CommonConfig {/*** 配置基于雪花算法生成全局唯一id* 参与…

打点 - 泛微 E-Cology WorkflowServiceXml

请求路径 /services%20/WorkflowServiceXml显示如下&#xff0c;漏洞可能存在 利用&#xff1a; 根据提示在 CMD 处输入 Memshell 注入内存马&#xff0c;并点击执行&#xff0c;成功注入 冰蝎配置&#xff0c;输入内存马地址 成功连接 命令执行

2024/9/30 英语每日一段

The British Academy has created three high-profile awards to sit alongside the trophies it hands out to adult television shows--going some way, it is hoped, to replace Bafta’s abandoned children’s TV awards event. “Children’s programme-making has been …

【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)

总览 1.下载和解决依赖问题 2.修改相关参数 3.安装过程 一、下载和解决依赖问题 1.下载 去这里看看&#xff0c;填写相关的显卡参数&#xff0c;选择 linux 版本&#xff0c;然后开始下载。 https://www.nvidia.cn/drivers/lookup/ 进入这个选择界面&#xff1a; 开始下载&…

04-指向指针的指针

int main(int argc, const char* argv[]) {int x 5;int* p &x;*p 6;int** q &p;int*** r &q;printf("%d\n", *p);//指向p中的值 6printf("%d\n", *q);// 指向指针p的地址 printf("%d\n", *(*q));//指向p中地址中的值 6print…

3.1K Star,这款开源在线视频下载神器绝了,速度达 30M/S

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在如今的数字时代&#xff0c;无论是个人用户还是企业&#xff0c;都…

学科竞赛管理平台:SpringBoot框架深度开发

摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

odoo中查找模型以及继承模型的全部字段

快捷键alt k呼出命令菜单&#xff0c;或者直接按alt h呼出界面如下&#xff1a; 输入模型 按模型的名称搜索 视图、字段在里面都能找到了 或者点击这里

TongESB7, TongGW, admin账号密码重置方式

停止控制台 修改系统库 identities 表 configuration字段中的password 重启manage

常用的英文文献数据库和资源平台

在学术研究中&#xff0c;获取和引用权威的英文文献资源是非常重要的。以下列举了几大最常用的英文文献数据库和资源平台&#xff0c;这些平台广泛收录了各类学术论文、期刊、会议论文、书籍等文献资料&#xff0c;是研究人员和学生常用的工具&#xff1a; 1. Google Scholar …

C嘎嘎入门篇:类和对象(2)

前言&#xff1a; 上一篇小编讲了类和对象&#xff08;1&#xff09;&#xff0c;当然&#xff0c;在看这篇文章之前&#xff0c;读者朋友们一定要掌握好前面的基础内容&#xff0c;因为这篇和前面息息相关&#xff0c;废话不多说&#xff0c;下面小编就加快步伐&#xff0c;开…

004集—— txt格式坐标写入cad(CAD—C#二次开发入门)

如图所示原始坐标格式&#xff0c;xy按空格分开&#xff0c;将坐标按顺序在cad中画成多段线&#xff1a; 坐标xy分开并按行重新输入txt&#xff0c;效果如下&#xff1a; 代码如下 &#xff1a; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; us…

新手必知的录屏工具及其使用方法详解

你平常会录屏吗&#xff1f;录屏已经成为了一项非常实用的技能。无论是制作教学视频还是记录游戏精彩瞬间&#xff0c;录屏都可以帮我们记录我们在电脑上看到的精彩瞬间。今天我们就一同来探索在电脑上如何录屏吧。 1.福昕录屏工具 链接&#xff1a;www.foxitsoftware.cn/REC…

N诺计算机考研-错题(DS)

具有线性结构的数据结构是&#xff08; &#xff09;。&#xff08;线性结构就是&#xff1a;在非空有限集合中&#xff0c;存在为一个被称为第一个的数据元素和最后一个元素&#xff0c;有除了第一个元素&#xff0c;集合中每一个元素均只有一个前驱&#xff0c;除了最后一个元…

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例 首先,找一根通讯线,如下图所示,打印机通讯线就可以, 通信线连接台达伺服驱动器和电脑后,打开ASDA-Soft软件,如下图所示,勾选On-Line,然后点击开始自动侦测, 如下图所示,正常情况下,软件可以自动侦测…

Oracle 相关的工具使用 SQL Developer , sqlplus

Oracle 相关的工具使用 SQL Developer &#xff0c; sqlplus 一&#xff0c;Oracle SQL Developer 连接数据库 今天在连接sqldeveloper服务器时遇到了很多问题&#xff0c;但最终还是通过网上的博客解决了问题&#xff0c;我就在总结一下我的解决过程。 一.界面 首先&#…

通过 OpenAI API 实测 o1 模型(附源码)

9.11 与 9.9 哪个大? 还记得之前给大家演示的幻觉问题么&#xff1f; 用 gpt4 系列模型提问“9.11 与 9.9 哪个大?” 大家可以回顾一下&#xff0c;即使引导了 COT 的思路&#xff0c;但是 gpt4 还是一本正经的胡说八道。 如今&#xff0c;o1 已经完美解决数学、逻辑推理方…

LampSecurityCTF7 靶机渗透 (sql 注入, 文件上传, 密码喷射)

靶机介绍 LampSecurityCTF7&#xff0c;vulnhub 靶机 主机发现 由于靶机配置问题&#xff0c;扫不到 ip 这里需要特别注意一下&#xff0c;在第一次启动打开靶机的时候&#xff0c;vmware会跳出一个提示框&#xff0c;让你选择我已复制该虚拟机/我已移动该虚拟机&#xff0c…

业绩由盈转亏,全面冲刺大模型的360值得期待吗?

在中国互联网市场上&#xff0c;360无疑是一家大家家喻户晓的公司&#xff0c;从安全软件起家&#xff0c;360的服务已经延展到了市场的方方面面&#xff0c;就在最近360的财报正式公布&#xff0c;很多人都在问360的财报该怎么看&#xff1f;全面冲刺大模型的360值得我们期待吗…