作者|KIDGINBROOK 更新|潘丽晨

NCCL是英伟达开源的GPU通信库,支持集合通信和点对点通信。

看下官方给的一个demo:


(相关资料图)

#include #include "cuda_runtime.h"#include "nccl.h"#include "mpi.h"#include #include #define MPICHECK(cmd) do { \ int e = cmd; \ if( e != MPI_SUCCESS ) { \ printf("Failed: MPI error %s:%d "%d"\n", \ __FILE__,__LINE__, e); \ exit(EXIT_FAILURE); \ } \} while(0) #define CUDACHECK(cmd) do { \ cudaError_t e = cmd; \ if( e != cudaSuccess ) { \ printf("Failed: Cuda error %s:%d "%s"\n", \ __FILE__,__LINE__,cudaGetErrorString(e)); \ exit(EXIT_FAILURE); \ } \} while(0) #define NCCLCHECK(cmd) do { \ ncclResult_t r = cmd; \ if (r!= ncclSuccess) { \ printf("Failed, NCCL error %s:%d "%s"\n", \ __FILE__,__LINE__,ncclGetErrorString(r)); \ exit(EXIT_FAILURE); \ } \} while(0) static uint64_t getHostHash(const char* string) { // Based on DJB2a, result = result * 33 ^ char uint64_t result = 5381; for (int c = 0; string[c] != "\0"; c++){ result = ((result << 5) + result) ^ string[c]; } return result;} static void getHostName(char* hostname, int maxlen) { gethostname(hostname, maxlen); for (int i=0; i< maxlen; i++) { if (hostname[i] == ".") { hostname[i] = "\0"; return; } }} int main(int argc, char* argv[]){ int size = 32*1024*1024; int myRank, nRanks, localRank = 0; //initializing MPI MPICHECK(MPI_Init(&argc, &argv)); MPICHECK(MPI_Comm_rank(MPI_COMM_WORLD, &myRank)); MPICHECK(MPI_Comm_size(MPI_COMM_WORLD, &nRanks)); //calculating localRank which is used in selecting a GPU uint64_t hostHashs[nRanks]; char hostname[1024]; getHostName(hostname, 1024); hostHashs[myRank] = getHostHash(hostname); MPICHECK(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, hostHashs, sizeof(uint64_t), MPI_BYTE, MPI_COMM_WORLD)); for (int p=0; p

在上边的示例中,rank0会执行ncclGetUniqueId获取Id,然后通过mpi广播给其他rank,接下来看下UniqueId是怎么产生的。

ncclResult_t ncclGetUniqueId(ncclUniqueId* out) { NCCLCHECK(ncclInit()); NCCLCHECK(PtrCheck(out, "GetUniqueId", "out")); return bootstrapGetUniqueId(out);}

然后看下ncclInit。

首先执行initEnv,设置环境变量。

然后执行initNet,用来初始化nccl所需要的网络,包括两个,一个是bootstrap网络,另外一个是数据通信网络,bootstrap网络主要用于初始化时交换一些简单的信息,比如每个机器的ip端口,由于数据量很小,而且主要是在初始化阶段执行一次,因此bootstrap使用的是tcp;而通信网络是用于实际数据的传输,因此会优先使用rdma(支持gdr的话会优先使用gdr)。

ncclResult_t initNet() { // Always initialize bootstrap network NCCLCHECK(bootstrapNetInit()); NCCLCHECK(initNetPlugin(&ncclNet, &ncclCollNet)); if (ncclNet != NULL) return ncclSuccess; if (initNet(&ncclNetIb) == ncclSuccess) { ncclNet = &ncclNetIb; } else { NCCLCHECK(initNet(&ncclNetSocket)); ncclNet = &ncclNetSocket; } return ncclSuccess;}

bootstrapNetInit就是bootstrap网络的初始化,主要就是通过findInterfaces遍历机器上所有的网卡信息,通过prefixList匹配选择使用哪些网卡,将可用网卡的信息保存下来,将ifa_name保存到全局的bootstrapNetIfNames,ip地址保存到全局bootstrapNetIfAddrs,默认除了docker和lo其他的网卡都可以使用。

例如在测试机器上有三张网卡,分别是xgbe0、xgbe1、xgbe2,那么就会把这三个ifaname和对应的ip地址保存下来,另外nccl提供了环境变量NCCL_SOCKET_IFNAME可以用来指定想用的网卡名,例如通过export NCCL_SOCKET_IFNAME=xgbe0来指定使用xgbe0,其实就是通过prefixList来匹配做到的。

static int findInterfaces(const char* prefixList, char* names, union socketAddress *addrs, int sock_family, int maxIfNameSize, int maxIfs) { struct netIf userIfs[MAX_IFS]; bool searchNot = prefixList && prefixList[0] == "^"; if (searchNot) prefixList++; bool searchExact = prefixList && prefixList[0] == "="; if (searchExact) prefixList++; int nUserIfs = parseStringList(prefixList, userIfs, MAX_IFS); int found = 0; struct ifaddrs *interfaces, *interface; getifaddrs(&interfaces); for (interface = interfaces; interface && found < maxIfs; interface = interface->ifa_next) { if (interface->ifa_addr == NULL) continue; int family = interface->ifa_addr->sa_family; if (family != AF_INET && family != AF_INET6) continue; if (sock_family != -1 && family != sock_family) continue; if (family == AF_INET6) { struct sockaddr_in6* sa = (struct sockaddr_in6*)(interface->ifa_addr); if (IN6_IS_ADDR_LOOPBACK(&sa->sin6_addr)) continue; } if (!(matchIfList(interface->ifa_name, -1, userIfs, nUserIfs, searchExact) ^ searchNot)) { continue; } bool duplicate = false; for (int i = 0; i < found; i++) { if (strcmp(interface->ifa_name, names+i*maxIfNameSize) == 0) { duplicate = true; break; } } if (!duplicate) { strncpy(names+found*maxIfNameSize, interface->ifa_name, maxIfNameSize); int salen = (family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); memcpy(addrs+found, interface->ifa_addr, salen); found++; } } freeifaddrs(interfaces); return found;}

开始初始化通信网络。

ncclNet_t结构体是一系列的函数指针,比如初始化,发送,接收等;socket,IB等通信方式都实现了自己的ncclNet_t,如ncclNetSocket,ncclNetIb,初始化通信网络的过程就是依次看哪个通信模式可用,然后赋值给全局的ncclNet。

首先执行initNetPlugin,查看是否有libnccl-net.so,测试环境没有这个so,所以直接返回。

然后尝试使用IB网络:

首先执行ncclNetIb的init函数,就是ncclIbInit。

ncclResult_t ncclIbInit(ncclDebugLogger_t logFunction) { static int shownIbHcaEnv = 0; if(wrap_ibv_symbols() != ncclSuccess) { return ncclInternalError; } if (ncclParamIbDisable()) return ncclInternalError; if (ncclNIbDevs == -1) { pthread_mutex_lock(&ncclIbLock); wrap_ibv_fork_init(); if (ncclNIbDevs == -1) { ncclNIbDevs = 0; if (findInterfaces(ncclIbIfName, &ncclIbIfAddr, MAX_IF_NAME_SIZE, 1) != 1) { WARN("NET/IB : No IP interface found."); return ncclInternalError; } // Detect IB cards int nIbDevs; struct ibv_device** devices; // Check if user defined which IB device:port to use char* userIbEnv = getenv("NCCL_IB_HCA"); if (userIbEnv != NULL && shownIbHcaEnv++ == 0) INFO(NCCL_NET|NCCL_ENV, "NCCL_IB_HCA set to %s", userIbEnv); struct netIf userIfs[MAX_IB_DEVS]; bool searchNot = userIbEnv && userIbEnv[0] == "^"; if (searchNot) userIbEnv++; bool searchExact = userIbEnv && userIbEnv[0] == "="; if (searchExact) userIbEnv++; int nUserIfs = parseStringList(userIbEnv, userIfs, MAX_IB_DEVS); if (ncclSuccess != wrap_ibv_get_device_list(&devices, &nIbDevs)) return ncclInternalError; for (int d=0; dname); continue; } int nPorts = 0; struct ibv_device_attr devAttr; memset(&devAttr, 0, sizeof(devAttr)); if (ncclSuccess != wrap_ibv_query_device(context, &devAttr)) { WARN("NET/IB : Unable to query device %s", devices[d]->name); if (ncclSuccess != wrap_ibv_close_device(context)) { return ncclInternalError; } continue; } for (int port = 1; port <= devAttr.phys_port_cnt; port++) { struct ibv_port_attr portAttr; if (ncclSuccess != wrap_ibv_query_port(context, port, &portAttr)) { WARN("NET/IB : Unable to query port %d", port); continue; } if (portAttr.state != IBV_PORT_ACTIVE) continue; if (portAttr.link_layer != IBV_LINK_LAYER_INFINIBAND && portAttr.link_layer != IBV_LINK_LAYER_ETHERNET) continue; // check against user specified HCAs/ports if (! (matchIfList(devices[d]->name, port, userIfs, nUserIfs, searchExact) ^ searchNot)) { continue; } TRACE(NCCL_INIT|NCCL_NET,"NET/IB: [%d] %s:%d/%s ", d, devices[d]->name, port, portAttr.link_layer == IBV_LINK_LAYER_INFINIBAND ? "IB" : "RoCE"); ncclIbDevs[ncclNIbDevs].device = d; ncclIbDevs[ncclNIbDevs].guid = devAttr.sys_image_guid; ncclIbDevs[ncclNIbDevs].port = port; ncclIbDevs[ncclNIbDevs].link = portAttr.link_layer; ncclIbDevs[ncclNIbDevs].speed = ncclIbSpeed(portAttr.active_speed) * ncclIbWidth(portAttr.active_width); ncclIbDevs[ncclNIbDevs].context = context; strncpy(ncclIbDevs[ncclNIbDevs].devName, devices[d]->name, MAXNAMESIZE); NCCLCHECK(ncclIbGetPciPath(ncclIbDevs[ncclNIbDevs].devName, &ncclIbDevs[ncclNIbDevs].pciPath, &ncclIbDevs[ncclNIbDevs].realPort)); ncclIbDevs[ncclNIbDevs].maxQp = devAttr.max_qp; ncclNIbDevs++; nPorts++; pthread_create(&ncclIbAsyncThread, NULL, ncclIbAsyncThreadMain, context); } if (nPorts == 0 && ncclSuccess != wrap_ibv_close_device(context)) { return ncclInternalError; } } if (nIbDevs && (ncclSuccess != wrap_ibv_free_device_list(devices))) { return ncclInternalError; }; } if (ncclNIbDevs == 0) { INFO(NCCL_INIT|NCCL_NET, "NET/IB : No device found."); } else { char line[1024]; line[0] = "\0"; for (int d=0; d

首先第三行通过wrap_ibv_symbols加载动态库libibverbs.so,然后获取动态库的各个函数。

然后通过wrap_ibv_fork_init避免fork引起rdma网卡读写出错。

后面会讲到ib网络也会用到socket进行带外网络的传输,所以这里也通过findInterfaces获取一个可用的网卡保存到ncclIbIfAddr。

通过ibv_get_device_list获取所有rdma设备到devices中,遍历devices的每个device,因为每个HCA可能有多个物理port,所以对每个device遍历每一个物理port,获取每个port的信息。

然后将相关信息保存到全局的ncclIbDevs中,比如是哪个device的哪个port,使用的是IB还是ROCE,device的pci路径,maxqp,device的name等,注意这里也有类似bootstrap网络NCCL_SOCKET_IFNAME的环境变量,叫NCCL_IB_HCA,可以指定使用哪个IB HCA。

到这里整个初始化的过程就完成了,一句话总结就是,获取了当前机器上所有可用的IB网卡和普通以太网卡之后保存下来。

然后开始生成UniqueId。

ncclResult_t bootstrapCreateRoot(ncclUniqueId* id, bool idFromEnv) { ncclNetHandle_t* netHandle = (ncclNetHandle_t*) id; void* listenComm; NCCLCHECK(bootstrapNetListen(idFromEnv ? dontCareIf : 0, netHandle, &listenComm)); pthread_t thread; pthread_create(&thread, NULL, bootstrapRoot, listenComm); return ncclSuccess;}

ncclNetHandle_t也是一个字符数组,然后执行bootstrapNetListen。

static ncclResult_t bootstrapNetListen(int dev, ncclNetHandle_t* netHandle, void** listenComm) { union socketAddress* connectAddr = (union socketAddress*) netHandle; static_assert(sizeof(union socketAddress) < NCCL_NET_HANDLE_MAXSIZE, "union socketAddress size is too large"); // if dev >= 0, listen based on dev if (dev >= 0) { NCCLCHECK(bootstrapNetGetSocketAddr(dev, connectAddr)); } else if (dev == findSubnetIf) { ... } // Otherwise, handle stores a local address struct bootstrapNetComm* comm; NCCLCHECK(bootstrapNetNewComm(&comm)); NCCLCHECK(createListenSocket(&comm->fd, connectAddr)); *listenComm = comm; return ncclSuccess;}

依次看下这三个函数,通过bootstrapNetGetSocketAddr获取一个可用的ip地址。

static ncclResult_t bootstrapNetGetSocketAddr(int dev, union socketAddress* addr) { if (dev >= bootstrapNetIfs) return ncclInternalError; memcpy(addr, bootstrapNetIfAddrs+dev, sizeof(*addr)); return ncclSuccess;}

此时dev是0, bootstrapNetIfs是初始化bootstrap网络的时候一共找到了几个可用的网卡,这里就是获取了第0个可用的ip地址。

然后通过bootstrapNetNewComm创建bootstrapNetComm,bootstrapNetComm其实就是fd,bootstrapNetNewComm其实就是new了一个bootstrapNetComm。

struct bootstrapNetComm { int fd; };

通过createListenSocket启动socker server。

static ncclResult_t createListenSocket(int *fd, union socketAddress *localAddr) { /* IPv4/IPv6 support */ int family = localAddr->sa.sa_family; int salen = (family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); /* Create socket and bind it to a port */ int sockfd = socket(family, SOCK_STREAM, 0); if (sockfd == -1) { WARN("Net : Socket creation failed : %s", strerror(errno)); return ncclSystemError; } if (socketToPort(&localAddr->sa)) { // Port is forced by env. Make sure we get the port. int opt = 1;#if defined(SO_REUSEPORT) SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)), "setsockopt");#else SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)), "setsockopt");#endif } // localAddr port should be 0 (Any port) SYSCHECK(bind(sockfd, &localAddr->sa, salen), "bind"); /* Get the assigned Port */ socklen_t size = salen; SYSCHECK(getsockname(sockfd, &localAddr->sa, &size), "getsockname"); #ifdef ENABLE_TRACE char line[1024]; TRACE(NCCL_INIT|NCCL_NET,"Listening on socket %s", socketToString(&localAddr->sa, line));#endif /* Put the socket in listen mode * NB: The backlog will be silently truncated to the value in /proc/sys/net/core/somaxconn */ SYSCHECK(listen(sockfd, 16384), "listen"); *fd = sockfd; return ncclSuccess;}

创建监听fd,ip由localaddr指定,初始端口为0,bind时随机找一个可用端口,并通过getsockname(sockfd, &localAddr->sa, &size)将ip端口写回到localaddr,这里localaddr就是UniqueId。

到这里UniqueId也就产生了,其实就是当前机器的ip和port。 (本文经授权后由OneFlow发布。原文:https://blog.csdn.net/KIDGIN7439/article/details/126712106?spm=1001.2014.3001.5502)  

其他人都在看

One-YOLOv5 v1.2.0发布

超越ChatGPT:大模型的智能极限

对抗软件系统复杂性③:恰当分层,不多不少

ChatGPT作者Schulman:我们成功的秘密武器

比快更快,开源Stable Diffusion刷新作图速度

OneEmbedding:单卡训练TB级推荐模型不是梦

GLM训练加速:性能最高提升3倍,显存节省1/3

欢迎Star、试用OneFlow新版本:

推荐内容

  • NCCL源码解析①:初始化及ncclUniqueId的产生-时讯
    NCCL源码解析①:初始化及ncclUniqueId的产生-时讯

  • windows aero的桌面性能怎么提高_windows aero的桌面性能
    windows aero的桌面性能怎么提高_windows aero的桌面性能

  • 长沙租房补贴申请天心区去哪里办理-世界观热点
    长沙租房补贴申请天心区去哪里办理-世界观热点

  • 云阳学校激励青少年健康成长
    云阳学校激励青少年健康成长

  • 八年级数学课课练答案_数学课课练八年级上答案-全球速看
    八年级数学课课练答案_数学课课练八年级上答案-全球速看

  • 3月16日基金净值:富国沪港深业绩驱动混合型A最新净值1.621,跌1.2%
    3月16日基金净值:富国沪港深业绩驱动混合型A最新净值1.621,跌1.2%

  • 美政府倾向于另一家银行收购硅谷银行 VC、PE机构竞购遇阻
    美政府倾向于另一家银行收购硅谷银行 VC、PE机构竞购遇阻

  • 杭州东站到西湖 地铁(杭州东站到西湖地铁)-当前快播
    杭州东站到西湖 地铁(杭州东站到西湖地铁)-当前快播

  • 助力秦巴山区(汉中)中医药产业高质量发展大会在汉中召开-全球热推荐
    助力秦巴山区(汉中)中医药产业高质量发展大会在汉中召开-全球热推荐

  • 平顺县气象台发布暴雪蓝色预警【Ⅳ级/一般】【2023-03-16】-环球快看
    平顺县气象台发布暴雪蓝色预警【Ⅳ级/一般】【2023-03-16】-环球快看

  • 03月16日12时海南东方疫情数据 阳了以后为什么会腰疼?应该怎么办?
    03月16日12时海南东方疫情数据 阳了以后为什么会腰疼?应该怎么办?

  • 电影《忠犬八公》发布“狗狗超会演”特辑及海报 人和狗狗戏里戏外有爱相伴-环球热推荐
    电影《忠犬八公》发布“狗狗超会演”特辑及海报 人和狗狗戏里戏外有爱相伴-环球热推荐

  • 三个牛念什么字拼音(三个牛念什么)-每日热点
    三个牛念什么字拼音(三个牛念什么)-每日热点

  • 柳擎最后实力_柳擎
    柳擎最后实力_柳擎

  • 斯基拉奇看好小因扎吉,曼纳需要拉拢图赫尔,穆帅属于“垫脚石”
    斯基拉奇看好小因扎吉,曼纳需要拉拢图赫尔,穆帅属于“垫脚石”

  • _言_语的成语__言_语-即时焦点
    _言_语的成语__言_语-即时焦点

  • 市场监管总局:全力优化消费环境 为消费者办实事、解难题
    市场监管总局:全力优化消费环境 为消费者办实事、解难题

  • 万东医疗董秘回复:无液氦磁共振为引领行业转型升级的技术,产品具备一定的竞争优势,解决了长期困扰用户的问题-天天精选
    万东医疗董秘回复:无液氦磁共振为引领行业转型升级的技术,产品具备一定的竞争优势,解决了长期困扰用户的问题-天天精选

  • 赛轮轮胎(601058)3月15日主力资金净买入1913.36万元-每日焦点
    赛轮轮胎(601058)3月15日主力资金净买入1913.36万元-每日焦点

  • 2023郑州暖气几号停止供暖?-每日报道
    2023郑州暖气几号停止供暖?-每日报道

  • 品质之路,再获嘉誉,源氏木语斩获“2023年度家居行业服务榜样”-天天新视野
    品质之路,再获嘉誉,源氏木语斩获“2023年度家居行业服务榜样”-天天新视野

  • 三月下半月煤价相对稳定
    三月下半月煤价相对稳定

  • 牛年的吉祥语顺口溜_带牛的四字成语新年祝福语大全-当前头条
    牛年的吉祥语顺口溜_带牛的四字成语新年祝福语大全-当前头条

  • 铁将军双向防盗器推荐_铁将军双向防盗器-全球速看料
    铁将军双向防盗器推荐_铁将军双向防盗器-全球速看料

  • 小区免费会所交房三年突变收费健身房,绿城:房屋已出售-每日快报
    小区免费会所交房三年突变收费健身房,绿城:房屋已出售-每日快报

  • 安车检测:公司立足于汽车后市场行业,积极发展汽车后市场服务业务,目前已经建立了新车上牌照和上保险方面的服务
    安车检测:公司立足于汽车后市场行业,积极发展汽车后市场服务业务,目前已经建立了新车上牌照和上保险方面的服务

  • 长白山人参产值节节攀升 吉林省赴京推介寻风口-当前要闻
    长白山人参产值节节攀升 吉林省赴京推介寻风口-当前要闻

  • YOLOv5全面解析教程⑥:模型训练流程详解
    YOLOv5全面解析教程⑥:模型训练流程详解

  • 三星 Galaxy Z Fold 4 共有五个摄像头-观速讯
    三星 Galaxy Z Fold 4 共有五个摄像头-观速讯

  • 大量买美债的硅谷银行爆了,同样满手美债的日本小银行呢?-最新资讯
    大量买美债的硅谷银行爆了,同样满手美债的日本小银行呢?-最新资讯

  • 东方电气预计2022年净利27.5亿元-29.8亿元!-全球快报
    东方电气预计2022年净利27.5亿元-29.8亿元!-全球快报

  • 华硕ROG枪神7的隐忧:定价、定位、环保
    华硕ROG枪神7的隐忧:定价、定位、环保

  • 泰安新型冠状病毒肺炎疫情:3月14日泰安疫情最新消息今天数据统计情况通报-播资讯
    泰安新型冠状病毒肺炎疫情:3月14日泰安疫情最新消息今天数据统计情况通报-播资讯

  • 人生格言座右铭大全精选 人生格言座右铭大全
    人生格言座右铭大全精选 人生格言座右铭大全

  • 中国国航(601111.SH)聘任王明远为总裁 孙玉权为总会计师 肖烽为总经济师-天天报道
    中国国航(601111.SH)聘任王明远为总裁 孙玉权为总会计师 肖烽为总经济师-天天报道

  • 滕哈格:卡塞米罗球风强硬但绝对不脏;10人作战我们踢得很好-环球观天下
    滕哈格:卡塞米罗球风强硬但绝对不脏;10人作战我们踢得很好-环球观天下

  • 茄子祛斑会有什么弊端_茄子祛斑-全球今头条
    茄子祛斑会有什么弊端_茄子祛斑-全球今头条

  • 满怀信心再出发(两会今日谈)-当前速读
    满怀信心再出发(两会今日谈)-当前速读

  • One-YOLOv5 v1.2.0发布:支持分类、检测、实例分割
    One-YOLOv5 v1.2.0发布:支持分类、检测、实例分割

  • 云南省元阳县发布暴雨黄色预警-天天视讯
    云南省元阳县发布暴雨黄色预警-天天视讯

  • 回顾李薇案:她是多名高官的共享情妇,45天狂赚2亿,最终被判5年
    回顾李薇案:她是多名高官的共享情妇,45天狂赚2亿,最终被判5年

  • 外企观两会 |“中国机遇”更加明朗 在华发展更有信心
    外企观两会 |“中国机遇”更加明朗 在华发展更有信心

  • 怎样转账,有以下四种方法-观点
    怎样转账,有以下四种方法-观点

  • 呼吁硅谷银行“接盘侠”!红杉等超100家风投联合声明:希望继续维持合作关系
    呼吁硅谷银行“接盘侠”!红杉等超100家风投联合声明:希望继续维持合作关系

  • 网曝林志玲已离婚!丈夫多次出轨还家暴,已经1年没有公开互动-微动态
    网曝林志玲已离婚!丈夫多次出轨还家暴,已经1年没有公开互动-微动态

  • 女子出门吃烧烤没带狗狗,不久收到邻居发来的消息:赶紧回家吧
    女子出门吃烧烤没带狗狗,不久收到邻居发来的消息:赶紧回家吧

  • 获胜仍然愤怒!杜峰不满广东男篮:领先就自满,这已不是第一次了
    获胜仍然愤怒!杜峰不满广东男篮:领先就自满,这已不是第一次了

  • 《崂山探花郎》没有一个流量明星,这部剧会糊吗?-天天即时看
    《崂山探花郎》没有一个流量明星,这部剧会糊吗?-天天即时看

  • 纪录片《世界历史》解说词文本33  英国资本主义的起源
    纪录片《世界历史》解说词文本33 英国资本主义的起源

  • 拔牙后吃什么_智齿拔除第三天是高峰期
    拔牙后吃什么_智齿拔除第三天是高峰期

  • 范明主演的电视剧_关于范明主演的电视剧的基本详情介绍-微动态
    范明主演的电视剧_关于范明主演的电视剧的基本详情介绍-微动态

  • 吉化-天天视点
    吉化-天天视点

  • 阴历十月一上坟讲究_阴历十月一-天天聚看点
    阴历十月一上坟讲究_阴历十月一-天天聚看点

  • 秉承后面跟什么词性填空_秉承-环球新要闻
    秉承后面跟什么词性填空_秉承-环球新要闻

  • 临高聚焦高新技术助力企业发展提质增效-全球速看
    临高聚焦高新技术助力企业发展提质增效-全球速看

  • 【达摩院OpenVI】图像MOS评价协助清理“垃圾”照片-世界热闻
    【达摩院OpenVI】图像MOS评价协助清理“垃圾”照片-世界热闻

  • 西南证券:通过百度智能云接入文心一言能力
    西南证券:通过百度智能云接入文心一言能力

  • 画小兔子最简单的方法_画小兔子图片-资讯推荐
    画小兔子最简单的方法_画小兔子图片-资讯推荐

  • 荔湾广场为什么_荔湾广场5层为啥不能去
    荔湾广场为什么_荔湾广场5层为啥不能去

  • 自免肝的症状和治疗方法_自免肝的症状
    自免肝的症状和治疗方法_自免肝的症状

  • 【机构调研记录】中信保诚基金调研汇川技术-环球快资讯
    【机构调研记录】中信保诚基金调研汇川技术-环球快资讯

  • 北京101网校加盟_北京101网校-全球消息
    北京101网校加盟_北京101网校-全球消息

  • 发票抵扣勾选操作流程_发票抵扣
    发票抵扣勾选操作流程_发票抵扣

  • 十二星座的女生谁最美_十二星座女生谁最美
    十二星座的女生谁最美_十二星座女生谁最美

  • 火星教育网课_火星学习网-速读
    火星教育网课_火星学习网-速读

  • [Docker]如何使用Docker部署一个go程序
    [Docker]如何使用Docker部署一个go程序

  • [oeasy]python0104_指示灯_显示_LED_辉光管_霓虹灯-环球热点评
    [oeasy]python0104_指示灯_显示_LED_辉光管_霓虹灯-环球热点评

  • 【OpenVI】AIGC纪元,兔年AI绘画实践-当前快播
    【OpenVI】AIGC纪元,兔年AI绘画实践-当前快播

  • ChatGPT作者John Schulman:我们成功的秘密武器-世界微动态
    ChatGPT作者John Schulman:我们成功的秘密武器-世界微动态

  • 岁月如梭时光飞逝的意思_时光飞逝的意思-每日热议
    岁月如梭时光飞逝的意思_时光飞逝的意思-每日热议

  • 五大运营商联手构建基于5G的卫星互联网技术标准体系
    五大运营商联手构建基于5G的卫星互联网技术标准体系

  • 法律问题提问_提问问题-天天微动态
    法律问题提问_提问问题-天天微动态

  • csgo什么箱子出刀概率高_csgo什么箱子出什么刀
    csgo什么箱子出刀概率高_csgo什么箱子出什么刀

  • 神武手游3什么职业好_神武3什么职业最吃香
    神武手游3什么职业好_神武3什么职业最吃香

  • 星辉娱乐:目前《战地无疆》小范围的测试数据达到公司及发行方的预期-环球热闻
    星辉娱乐:目前《战地无疆》小范围的测试数据达到公司及发行方的预期-环球热闻

  • 促销潮蔓延 汽车全面降价已来临?比亚迪或是最大功臣!-短讯
    促销潮蔓延 汽车全面降价已来临?比亚迪或是最大功臣!-短讯

  • 中南财大的分数线多少啊_中南财大的分数线多少-当前短讯
    中南财大的分数线多少啊_中南财大的分数线多少-当前短讯

  • 桃字的笔顺的读法-热点
    桃字的笔顺的读法-热点

  • 中银润利混合C基金经理发生变更-每日看点
    中银润利混合C基金经理发生变更-每日看点

  • cf灵狐者的约定怎么领会员_cf灵狐约定怎么领会员-环球要闻
    cf灵狐者的约定怎么领会员_cf灵狐约定怎么领会员-环球要闻

  • 24岁女孩回应大学毕业养猪:专业对口 年薪10万-全球百事通
    24岁女孩回应大学毕业养猪:专业对口 年薪10万-全球百事通

  • 8个月宝宝橙子怎么吃_橙子怎么吃
    8个月宝宝橙子怎么吃_橙子怎么吃

  • proe论坛爱好者_proe论坛-全球观察
    proe论坛爱好者_proe论坛-全球观察

  • 唐璜拜伦原文_唐璜 拜伦-资讯
    唐璜拜伦原文_唐璜 拜伦-资讯

  • 唐七公子作品系列-环球头条
    唐七公子作品系列-环球头条

  • 84_说一说84的简介
    84_说一说84的简介

  • 岩棉管
    岩棉管

  • 南凌科技3月8日盘中涨停-天天观点
    南凌科技3月8日盘中涨停-天天观点

  • 2023全国两会特别报道,努力为人民群众生活品质提高办实事-微头条
    2023全国两会特别报道,努力为人民群众生活品质提高办实事-微头条

  • bottom的反义词-全球快资讯
    bottom的反义词-全球快资讯

  • 捷德最可怕的一个形态_欧布奥特曼三重形态-当前快播
    捷德最可怕的一个形态_欧布奥特曼三重形态-当前快播

  • 刘淑萍-环球今日讯
    刘淑萍-环球今日讯

  • 史记刺客列传豫让者_史记刺客列传豫让-环球观焦点
    史记刺客列传豫让者_史记刺客列传豫让-环球观焦点

  • 摩根士丹利亚洲首席经济学家:中国经济有力复苏,可抵御通胀压力-要闻速递
    摩根士丹利亚洲首席经济学家:中国经济有力复苏,可抵御通胀压力-要闻速递

  • 日本亚马逊能直邮中国吗-当前热讯
    日本亚马逊能直邮中国吗-当前热讯

  • 5只股票型ETF成交量超1000万手 华夏上证科创板50成份ETF成交1906.63万手-环球关注
    5只股票型ETF成交量超1000万手 华夏上证科创板50成份ETF成交1906.63万手-环球关注

  • 合肥师范老校区在哪啊
    合肥师范老校区在哪啊

  • 【达摩院OpenVI】开源体验AI云台,去视频抖动-当前通讯
    【达摩院OpenVI】开源体验AI云台,去视频抖动-当前通讯

  • 星际争霸:前线3-4_对于星际争霸:前线3-4简单介绍-当前资讯
    星际争霸:前线3-4_对于星际争霸:前线3-4简单介绍-当前资讯

  • 美国科技公司裁员后 计算机科学专业学生今年起薪预计将下降4%-速看料
    美国科技公司裁员后 计算机科学专业学生今年起薪预计将下降4%-速看料

  • colles骨折
    colles骨折

  • 卧龙:苍天陨落多功能修改器推荐附下载地址-世界热点
    卧龙:苍天陨落多功能修改器推荐附下载地址-世界热点

  • Jasper狂飙:AIGC现象级应用的增长秘笈
    Jasper狂飙:AIGC现象级应用的增长秘笈

  • 顺丰快递会携带新冠病毒吗 快递消毒的正确步骤
    顺丰快递会携带新冠病毒吗 快递消毒的正确步骤

  • 镇平县曲屯镇召开“五星”支部创建工作推进会-讯息
    镇平县曲屯镇召开“五星”支部创建工作推进会-讯息

  • 设置主页为www_ha0123 com设为主页
    设置主页为www_ha0123 com设为主页

  • 魏朝利-全球速递
    魏朝利-全球速递

  • 茱萸在古代指什么寓意_茱萸在古代指什么-视讯
    茱萸在古代指什么寓意_茱萸在古代指什么-视讯

  • 圣诞老人公交车_圣诞老人村火车有几趟-要闻速递
    圣诞老人公交车_圣诞老人村火车有几趟-要闻速递

  • 大众宝来外观稳重,搭1.5L发动机,终端优惠大,迎战秦PLUS DM-i?-看点
    大众宝来外观稳重,搭1.5L发动机,终端优惠大,迎战秦PLUS DM-i?-看点

  • 蛇舌 电影
    蛇舌 电影

  • 三防是指哪三防人防技防_三防是指哪三防-世界速讯
    三防是指哪三防人防技防_三防是指哪三防-世界速讯

  • 甲流高发、新冠变异株再现……老年人该如何应对?
    甲流高发、新冠变异株再现……老年人该如何应对?

  • ios15.1要不要更新 ios15.1支持哪些机型-世界热点
    ios15.1要不要更新 ios15.1支持哪些机型-世界热点

  • 美利达公爵650配置
    美利达公爵650配置

  • GLOBALink|Brazil's mining giant upbeat about prospects of China's economic growth-观焦点
    GLOBALink|Brazil's mining giant upbeat about prospects of China's economic growth-观焦点

  • 【达摩院OpenVI】几行代码,尽享丝滑视频观感
    【达摩院OpenVI】几行代码,尽享丝滑视频观感

  • 超越ChatGPT:大模型的智能极限
    超越ChatGPT:大模型的智能极限

  • 发彩虹朋友圈的文案_发彩网-快资讯
    发彩虹朋友圈的文案_发彩网-快资讯

  • 改善性购房利率是否有可能下降?张波:建议给予优惠
    改善性购房利率是否有可能下降?张波:建议给予优惠

  • 从三个报告看2023民生新改善
    从三个报告看2023民生新改善

  • 数码学习机-滚动
    数码学习机-滚动

  • 肾在哪个位置图片男_肾在哪个位置
    肾在哪个位置图片男_肾在哪个位置

  • manual是什么
    manual是什么

  • 普兰德利:尤文拿到联赛前四相当于意甲夺冠,很难但并非不可能
    普兰德利:尤文拿到联赛前四相当于意甲夺冠,很难但并非不可能

  • 归田赋全文带拼音_归田赋意思
    归田赋全文带拼音_归田赋意思

  • 固态移动硬盘格式化成ntfs还是exfat_U盘格式化中的FAT32、exFAT、NTFS是什么-今日最新
    固态移动硬盘格式化成ntfs还是exfat_U盘格式化中的FAT32、exFAT、NTFS是什么-今日最新

  • 通江论坛麻辣社区新闻_通江论坛麻辣社区-全球快播报
    通江论坛麻辣社区新闻_通江论坛麻辣社区-全球快播报

  • 三育人属于什么荣誉_三育人-每日消息
    三育人属于什么荣誉_三育人-每日消息

  • 内蒙古二连浩特疫情怎么回事最新消息-全球新动态
    内蒙古二连浩特疫情怎么回事最新消息-全球新动态

  • 政府工作报告解读 | 中国宏观经济研究院投资研究所研究员吴亚平:基建投资有必要保持稳定增长-环球热议
    政府工作报告解读 | 中国宏观经济研究院投资研究所研究员吴亚平:基建投资有必要保持稳定增长-环球热议

  • c调24孔口琴简谱流行曲100首_口琴24孔c调的流行歌
    c调24孔口琴简谱流行曲100首_口琴24孔c调的流行歌

  • 生卒年月卒的意思是什么_生卒年月卒的意思
    生卒年月卒的意思是什么_生卒年月卒的意思

  • 摔角动态吉姆·罗斯预测送葬者即将回归-观热点
    摔角动态吉姆·罗斯预测送葬者即将回归-观热点

  • 儿童羽绒服十大名牌排名 儿童羽绒服品牌排行榜前十名-环球快讯
    儿童羽绒服十大名牌排名 儿童羽绒服品牌排行榜前十名-环球快讯

  • 无敌小手称重达人好玩吗 无敌小手称重达人玩法简介-热议
    无敌小手称重达人好玩吗 无敌小手称重达人玩法简介-热议

  • 云加一笔是什么字10个_云加一笔是什么字-全球快播报
    云加一笔是什么字10个_云加一笔是什么字-全球快播报

  • 结合普陀区“中华武数”科创布局, 桃浦镇持续做好地区转型发展大文章-环球关注
    结合普陀区“中华武数”科创布局, 桃浦镇持续做好地区转型发展大文章-环球关注

  • 李宪被称为让皇帝,假如当年不让,会怎样?-全球观天下
    李宪被称为让皇帝,假如当年不让,会怎样?-全球观天下

  • 和达科技(688296)3月3日主力资金净卖出457.04万元
    和达科技(688296)3月3日主力资金净卖出457.04万元

  • 100位为新中国成立作出突出贡献的英雄模范人物:小叶丹
    100位为新中国成立作出突出贡献的英雄模范人物:小叶丹

  • 黄河山东段安全度过凌汛期
    黄河山东段安全度过凌汛期

  • GPT-3/ChatGPT复现的经验教训
    GPT-3/ChatGPT复现的经验教训

  • YOLOv5全面解析教程⑤:计算mAP用到的Numpy函数详解
    YOLOv5全面解析教程⑤:计算mAP用到的Numpy函数详解

  • 斗破苍穹之唯我独尊小说全集_斗破苍穹之唯我独尊
    斗破苍穹之唯我独尊小说全集_斗破苍穹之唯我独尊

  • 牙髓炎吃什么药最有效_牙髓炎怎么治疗
    牙髓炎吃什么药最有效_牙髓炎怎么治疗

  • 2015年全国心智哲学与认知语言学学术研讨会
    2015年全国心智哲学与认知语言学学术研讨会

  • 贫血吃什么食物最好最快_贫血吃什么好 贫血的饮食注意事项-当前速讯
    贫血吃什么食物最好最快_贫血吃什么好 贫血的饮食注意事项-当前速讯

  • 真的丢脸?国足U20亚洲杯对手输越南,2连败后被嘲讽,我们太自信-环球今热点
    真的丢脸?国足U20亚洲杯对手输越南,2连败后被嘲讽,我们太自信-环球今热点

  • wlk猎人学什么专业技能好_猎人学什么专业技能好
    wlk猎人学什么专业技能好_猎人学什么专业技能好

  • 赛生药业(06600):要约结束 将回购合共7753.48万股股份
    赛生药业(06600):要约结束 将回购合共7753.48万股股份

  • 数源科技:公司目前未参与国资云项目-快看点
    数源科技:公司目前未参与国资云项目-快看点

  • 2023 中国电商“百亿补贴大战”的暗喻-全球观察
    2023 中国电商“百亿补贴大战”的暗喻-全球观察

  • BIM造价应用-看热讯
    BIM造价应用-看热讯

  • 直播电商第一股,怎么去种地了-世界观焦点
    直播电商第一股,怎么去种地了-世界观焦点

  • 天孚通信3月1日快速上涨
    天孚通信3月1日快速上涨

  • 三死一伤太残忍!矛盾激化起杀心!
    三死一伤太残忍!矛盾激化起杀心!

  • 360安全浏览器老是崩溃_360安全浏览器假死怎么处理
    360安全浏览器老是崩溃_360安全浏览器假死怎么处理

  • 500毫升是多少斤等于多少升_500毫升是多少斤-世界信息
    500毫升是多少斤等于多少升_500毫升是多少斤-世界信息

  • 猪八戒的经典事例_关于猪八戒的经典故事-全球百事通
    猪八戒的经典事例_关于猪八戒的经典故事-全球百事通

  • 什么的闪电填词语填空_什么的闪电填词语-观焦点
    什么的闪电填词语填空_什么的闪电填词语-观焦点

  • 税收亿元楼达82幢、“巨无霸”央企落户,上海静安如何做到-天天快看
    税收亿元楼达82幢、“巨无霸”央企落户,上海静安如何做到-天天快看

  • 夏家三千金怎么只有40集_夏家三千金 40集了还有续集吗
    夏家三千金怎么只有40集_夏家三千金 40集了还有续集吗

  • 京东退货流程手机_京东退货流程-天天资讯
    京东退货流程手机_京东退货流程-天天资讯

  • 启迪环境:公司水务版块主要业务为生态水环境治理等市政公用工程建设及项目运维等服务-全球热推荐
    启迪环境:公司水务版块主要业务为生态水环境治理等市政公用工程建设及项目运维等服务-全球热推荐

  • 善举!莫德里奇向地震灾区捐赠在卡塔尔世界杯季军战所穿球衣
    善举!莫德里奇向地震灾区捐赠在卡塔尔世界杯季军战所穿球衣

  • 中国新城市为众安附属公司19亿中票注册提供物业质押反担保
    中国新城市为众安附属公司19亿中票注册提供物业质押反担保

  • YOLOv5全面解析教程④:目标检测模型精确度评估-全球新视野
    YOLOv5全面解析教程④:目标检测模型精确度评估-全球新视野

  • Salli-消息
    Salli-消息

  • 金信诺董秘回复:公司目前经营稳定,生产业务正常开展,相关财务情况请您关注公司的定期报告
    金信诺董秘回复:公司目前经营稳定,生产业务正常开展,相关财务情况请您关注公司的定期报告

  • 今天最新消息 “义新欧”中欧班列今年已开千列 “疫”下日均超4列-时讯
    今天最新消息 “义新欧”中欧班列今年已开千列 “疫”下日均超4列-时讯

  • 最严办法出台!私募基金入行门槛全面提高,投资人:希望大力执行落地
    最严办法出台!私募基金入行门槛全面提高,投资人:希望大力执行落地

  • 罗马假日女主角名字英文_罗马假日女主角
    罗马假日女主角名字英文_罗马假日女主角

  • 我市创新模式破解学校危废化学品处置难题-头条焦点
    我市创新模式破解学校危废化学品处置难题-头条焦点

  • 女性念珠菌感染的症状图片_女性念珠菌感染的症状-信息
    女性念珠菌感染的症状图片_女性念珠菌感染的症状-信息

  • 渭的读音是什么_渭的读音-焦点讯息
    渭的读音是什么_渭的读音-焦点讯息

  • 专家呼吁:全面注册制后 GP要带着管理思维进场
    专家呼吁:全面注册制后 GP要带着管理思维进场

  • 华晨宝马是什么意思 _瑞虎7esp灯亮怎么消除-世界球精选
    华晨宝马是什么意思 _瑞虎7esp灯亮怎么消除-世界球精选

  • 甘肃法治政府建设示范地区和项目公布 入选的有……-时快讯
    甘肃法治政府建设示范地区和项目公布 入选的有……-时快讯

  • 我屁股上有个疙瘩-热点在线
    我屁股上有个疙瘩-热点在线

  • 每日一书|《观念的跃升》-当前速讯
    每日一书|《观念的跃升》-当前速讯

  • 洗头膏方 | 用18味草本熬制的洗发水,添加少,不堵塞头皮-看热讯
    洗头膏方 | 用18味草本熬制的洗发水,添加少,不堵塞头皮-看热讯

  • 上海市江湾初级中学
    上海市江湾初级中学

  • Linkedin避免封号技巧-环球百事通
    Linkedin避免封号技巧-环球百事通

  • 2月27日浙江武义神龙萤石价格暂稳
    2月27日浙江武义神龙萤石价格暂稳

  • 97号汽油
    97号汽油

  • 扬汤止沸什么物理原理避免安全事故?_扬汤止沸物理原理
    扬汤止沸什么物理原理避免安全事故?_扬汤止沸物理原理

  • 氢气分析仪介绍_氢气分析仪是什么
    氢气分析仪介绍_氢气分析仪是什么

  • 十大券商策略:牛市第一波上涨未完 中大盘成长成为新洼地-时讯
    十大券商策略:牛市第一波上涨未完 中大盘成长成为新洼地-时讯

  • 世纪冰川灵佛洞-世界快看点
    世纪冰川灵佛洞-世界快看点

  • 梦的传说-天天热点
    梦的传说-天天热点

  • 东营电力志-每日热文
    东营电力志-每日热文

  • 大连公安交警多举措提升机动车服务站办事效率-今日热闻
    大连公安交警多举措提升机动车服务站办事效率-今日热闻

  • 《冬日幸存者:序章》第二次更新:修复各式问题提升游戏体验-每日热门
    《冬日幸存者:序章》第二次更新:修复各式问题提升游戏体验-每日热门

  • 国际保理
    国际保理

  • 37岁世界冠军大变样!菲尔普斯老得像60岁,患抑郁症险自杀?
    37岁世界冠军大变样!菲尔普斯老得像60岁,患抑郁症险自杀?

  • 2月25日 早安心语-当前速读
    2月25日 早安心语-当前速读

  • 中国广播发轫史稿-今亮点
    中国广播发轫史稿-今亮点

  • 美国老牌PE大佬自杀身亡:曾首创杠杆收购,为股权私募先驱-微速讯
    美国老牌PE大佬自杀身亡:曾首创杠杆收购,为股权私募先驱-微速讯

  • 安卓如何打开m4a文件_安卓手机如何打开 m4s文件
    安卓如何打开m4a文件_安卓手机如何打开 m4s文件

WEB开发网