使用ROCm的HIP API向量加法程序
一、向量加法程序
Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个使用ROCm的实例,假设已经在符合要求的硬件上安装了ROCm环境。下面的例子是一个简单的向量加法程序,使用了ROCm的HIP API。
首先,需要编写 HIP 源代码,该代码之后可以被编译运行在 AMD GPU 上。可以创建一个名为 vector_add.cpp
的文件:
#include <hip/hip_runtime.h>
#include <iostream>#define N 50000__global__ void vector_add(float *out, float *a, float *b, int n) {int index = threadIdx.x + blockIdx.x * blockDim.x;if (index < n) {out[index] = a[index] + b[index];}
}int main() {float *a, *b, *out;float *d_a, *d_b, *d_out;// 分配host内存a = (float*)malloc(sizeof(float) * N);b = (float*)malloc(sizeof(float) * N);out = (float*)malloc(sizeof(float) * N);// 初始化数据for (int i = 0; i < N; i++) {a[i] = float(i);b[i] = float(i);}// 分配device(GPU)内存hipError_t err; err = hipMalloc((void**)&d_a, sizeof(float) * N);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMalloc failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }err = hipMalloc((void**)&d_b, sizeof(float) * N);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMalloc failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }err = hipMalloc((void**)&d_out, sizeof(float) * N);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMalloc failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }// 将host数据复制到device(GPU)上err = hipMemcpy(d_a, a, sizeof(float) * N, hipMemcpyHostToDevice);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMemcpy failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }err = hipMemcpy(d_b, b, sizeof(float) * N, hipMemcpyHostToDevice);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMemcpy failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }// 执行kernelint blockSize = 256;int gridSize = (int)ceil((float)N/blockSize);hipLaunchKernelGGL(vector_add, dim3(gridSize), dim3(blockSize), 0, 0, d_out, d_a, d_b, N);// 将计算结果复制回host内存err = hipMemcpy(out, d_out, sizeof(float) * N, hipMemcpyDeviceToHost);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipMemcpy failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }// 验证结果for (int i = 0; i < N; i++) {if (out[i] != a[i] + b[i]) {std::cerr << "结果验证失败,索引 " << i << ", " << out[i] << " != " << a[i] + b[i] << std::endl;break;}}// 释放内存err = hipFree(d_a); if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipFree failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }err = hipFree(d_b); if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipFree failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }err = hipFree(d_out);if (err != hipSuccess) {// 处理错误,比如打印错误信息并退出程序 fprintf(stderr, "hipFree failed: %s\n", hipGetErrorString(err)); exit(EXIT_FAILURE); }free(a); free(b); free(out);return 0;
}
接下来可以使用 hipcc
编译器来编译上述程序。hipcc 是一个包装好的编译器,用于将HIP源码编译为可以在准备好的AMD平台上运行的代码:
hipcc vector_add.cpp -o vector_add
编译成功后,可以运行生成的应用程序:
./vector_add
以上代码演示了如何使用HIP编写一个简单的GPU内核,其计算两个向量的逐元素加法。请确保在运行任何这些步骤之前,检查环境是否配置正确,ROCm是否与AMD GPU兼容,并且已正确安装。如果对ROCm更复杂的使用场景感兴趣,可以查看ROCm提供的示例和使用指南。
二、通义灵码
ROCm(Radeon Open Compute Platform)提供了HIP(Heterogeneous-Compute Interface for Portability)API,允许开发者编写高度可移植的代码,能够在AMD GPU和其他异构平台上运行。以下是一个使用HIP API编写的简单向量加法程序示例:
#include <hip/hip_runtime.h>
#include <iostream>#define VECTOR_SIZE 1024 // 向量长度// 定义向量加法的内核函数
__global__ void vectorAdd(float* A, float* B, float* C) {int idx = threadIdx.x + blockIdx.x * blockDim.x;if (idx < VECTOR_SIZE) {C[idx] = A[idx] + B[idx];}
}int main() {float* h_A; // 主机侧向量Afloat* h_B; // 主机侧向量Bfloat* h_C; // 主机侧结果向量C(用于验证)float* d_A; // 设备侧向量Afloat* d_B; // 设备侧向量Bfloat* d_C; // 设备侧结果向量Csize_t size = VECTOR_SIZE * sizeof(float);// 分配主机内存并初始化向量h_A = new float[VECTOR_SIZE];h_B = new float[VECTOR_SIZE];h_C = new float[VECTOR_SIZE];for (size_t i = 0; i < VECTOR_SIZE; ++i) {h_A[i] = static_cast<float>(i);h_B[i] = static_cast<float>(i * 2);}// 分配设备内存hipMalloc(&d_A, size);hipMalloc(&d_B, size);hipMalloc(&d_C, size);// 将主机内存数据复制到设备hipMemcpy(d_A, h_A, size, hipMemcpyHostToDevice);hipMemcpy(d_B, h_B, size, hipMemcpyHostToDevice);// 定义并启动内核dim3 blockSize(256); // 每块256个线程dim3 gridSize((VECTOR_SIZE + blockSize.x - 1) / blockSize.x); // 计算所需网格数vectorAdd<<<gridSize, blockSize>>>(d_A, d_B, d_C);// 将设备计算结果复制回主机hipMemcpy(h_C, d_C, size, hipMemcpyDeviceToHost);// 验证结果bool resultCorrect = true;for (size_t i = 0; i < VECTOR_SIZE; ++i) {if (h_C[i] != h_A[i] + h_B[i]) {resultCorrect = false;break;}}std::cout << "Vector addition test " << (resultCorrect ? "PASSED" : "FAILED") << std::endl;// 释放资源hipFree(d_A);hipFree(d_B);hipFree(d_C);delete[] h_A;delete[] h_B;delete[] h_C;return 0;
}
三、文心一言
HIP (Heterogeneous-compute Interface for Portability) 是一个用于简化在AMD GPU上编程的接口,它提供了类似于CUDA的编程模型,使得开发者可以更容易地将CUDA代码迁移到HIP上,以在AMD GPU上运行。
下面是一个简单的HIP程序示例,用于执行向量加法。请注意,这个示例假设你已经安装并配置了ROCm和HIP环境。
首先,你需要创建一个HIP源文件(例如,vector_add.hip),并写入以下代码:
#include <hip/hip_runtime.h>
#include <hip/hip_vector_types.h> __global__ void vector_add(float* A, float* B, float* C, int N) { int i = hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x; if (i < N) { C[i] = A[i] + B[i]; }
} int main(void) { const int N = 1 << 20; // 1M elements const size_t size = N * sizeof(float); // Allocate Unified Memory – accessible from CPU or GPU float *A, *B, *C; hipMallocManaged(&A, size); hipMallocManaged(&B, size); hipMallocManaged(&C, size); // Initialize data on the host for (int i = 0; i < N; i++) { A[i] = 1.0f; B[i] = 2.0f; } // Run kernel on 1M elements on the GPU hipLaunchKernelGGL((vector_add), dim3(N/256, 1, 1), dim3(256, 1, 1), 0, 0, A, B, C, N); // Wait for GPU to finish before accessing on host hipDeviceSynchronize(); // Verify results for (int i = 0; i < N; i++) { if (C[i] != 3.0f) { printf("Error at element %d: %f != 3.0f\n", i, C[i]); return -1; } } printf("Test PASSED\n"); // Free memory hipFree(A); hipFree(B); hipFree(C); return 0;
}
在这个示例中,vector_add 是一个GPU内核函数,用于执行向量加法。main 函数中首先分配了统一内存(Unified Memory),这是一种HIP和ROCm支持的特性,允许CPU和GPU无缝地访问同一块内存区域。然后,初始化数据并调用HIP内核。最后,验证结果并释放内存。
编译这个程序,你需要使用hipcc编译器,它是专门为HIP设计的。编译命令可能类似于:
hipcc -o vector_add vector_add.hip
确保你的环境变量和路径已经配置好,以便hipcc可以找到ROCm和HIP相关的库和头文件。
运行编译后的程序:
./vector_add
如果一切正常,你应该会看到“Test PASSED”的输出,表示向量加法已经成功执行。
请注意,HIP和ROCm的API和功能可能会随着版本的更新而发生变化,因此请确保查阅最新的官方文档以获取最准确的信息。
四、讯飞星火
以下是一个使用ROCm的HIP API进行向量加法的程序示例:
#include <iostream>
#include <vector>
#include <hip/hip_runtime.h>__global__ void vectorAdd(const float* A, const float* B, float* C, int numElements) {int i = blockDim.x * blockIdx.x + threadIdx.x;if (i < numElements) {C[i] = A[i] + B[i];}
}int main() {int numElements = 50000;size_t size = numElements * sizeof(float);float* h_A = new float[numElements];float* h_B = new float[numElements];float* h_C = new float[numElements];for (int i = 0; i < numElements; ++i) {h_A[i] = static_cast<float>(i);h_B[i] = static_cast<float>(i * 2);}float* d_A = nullptr;float* d_B = nullptr;float* d_C = nullptr;hipMalloc((void**)&d_A, size);hipMalloc((void**)&d_B, size);hipMalloc((void**)&d_C, size);hipMemcpy(d_A, h_A, size, hipMemcpyHostToDevice);hipMemcpy(d_B, h_B, size, hipMemcpyHostToDevice);dim3 dimBlock(256);dim3 dimGrid((numElements + dimBlock.x - 1) / dimBlock.x);hipLaunchKernelGGL(vectorAdd, dimGrid, dimBlock, 0, 0, d_A, d_B, d_C, numElements);hipMemcpy(h_C, d_C, size, hipMemcpyDeviceToHost);for (int i = 0; i < numElements; ++i) {if (fabs(h_A[i] + h_B[i] - h_C[i]) > 1e-5) {std::cout << "Result verification failed at element " << i << std::endl;break;}}delete[] h_A;delete[] h_B;delete[] h_C;hipFree(d_A);hipFree(d_B);hipFree(d_C);return 0;
}
这个程序首先创建了三个大小为`numElements`的浮点数数组`h_A`、`h_B`和`h_C`,并将`h_A`和`h_B`的元素分别设置为连续的整数。然后,它使用HIP API分配设备内存并将主机数据复制到设备上。接下来,它定义了一个名为`vectorAdd`的CUDA内核函数,该函数将两个输入向量相加并将结果存储在输出向量中。最后,它将计算结果从设备复制回主机,并验证结果的正确性。如果结果验证失败,则输出错误信息。最后,它释放了所有分配的内存。
五、Kimi
ROCm(Radeon Open Compute)是一个开源的计算平台,旨在为AMD GPU提供高性能的计算能力。HIP(Heterogeneous-compute Interface for Portability)是ROCm的一个C/C++运行时API,它允许开发者编写可在多种计算设备上运行的代码,包括CPU和GPU。
下面是一个使用ROCm的HIP API实现的简单向量加法程序示例。这个程序将创建两个向量,将它们相加,并输出结果。
#include <hip/hip_runtime.h>
#include <iostream>__global__ void vectorAdd(const float *A, const float *B, float *C, int N) {int i = hipBlockIdx.x * hipBlockDim.x + hipThreadIdx.x;if (i < N) {C[i] = A[i] + B[i];}
}int main() {int N = 1 << 10; // 向量大小size_t size = N * sizeof(float);float *h_A, *h_B, *h_C;float *d_A, *d_B, *d_C;// 分配主机内存h_A = new float[N];h_B = new float[N];h_C = new float[N];// 初始化主机向量for (int i = 0; i < N; i++) {h_A[i] = i;h_B[i] = i * 2;}// 分配设备内存hipMalloc((void **)&d_A, size);hipMalloc((void **)&d_B, size);hipMalloc((void **)&d_C, size);// 将主机向量复制到设备hipMemcpy(d_A, h_A, size, hipMemcpyHostToDevice);hipMemcpy(d_B, h_B, size, hipMemcpyHostToDevice);// 启动核函数hipLaunchKernelGGL(vectorAdd, dim3((N + 255) / 256), dim3(256), 0, 0, d_A, d_B, d_C, N);// 将结果从设备复制回主机hipMemcpy(h_C, d_C, size, hipMemcpyDeviceToHost);// 验证结果for (int i = 0; i < N; i++) {if (h_C[i] != (h_A[i] + h_B[i])) {std::cout << "Error: C[" << i << "] != A[" << i << "] + B[" << i << "]" << std::endl;break;}}// 释放设备内存hipFree(d_A);hipFree(d_B);hipFree(d_C);// 释放主机内存delete[] h_A;delete[] h_B;delete[] h_C;return 0;
}
在这个程序中,我们首先定义了一个名为`vectorAdd`的核函数,它将在GPU上执行。然后在`main`函数中,我们分配了主机和设备的内存,初始化了两个向量,并将它们复制到设备内存中。
接下来,我们调用`hipLaunchKernelGGL`函数来启动核函数。核函数执行后,我们将结果从设备内存复制回主机内存,并验证结果是否正确。
最后,我们释放了所有分配的内存资源。
要编译和运行这个程序,你需要安装ROCm软件平台,并使用`hipcc`编译器。例如,你可以使用以下命令来编译这个程序:
hipcc -o vector_add vector_add.cu
./vector_add
请注意,这个程序是一个基本的示例,实际使用时可能需要根据具体情况进行调整。此外,为了提高性能,你可能需要调整线程块大小和网格大小等参数。
相关文章:
使用ROCm的HIP API向量加法程序
一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…...
Vue3---基础7(Props)
props,用于给子组件传递父组件的值的方法 代码示例: 父组件 <template><Text1 :list"personList"/> </template><script lang"ts" setup namae"App">import Text1 from ./components/text2.vu…...
第一节:什么是操作系统
什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示: 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…...
Day:007(1) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)
Scrapy的介绍 Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。 尽管 Scrapy 最初是为网络抓取而设计的,但它也可用于使用API提取数据或用作通用网络爬虫。 Scrapy的优势…...
Echarts使用dataTool写可自定义横坐标的盒须图(箱线图)
在vue2中的完整盒须图组件代码 可自适应浏览器窗体变化,可自定义横坐标,无需写箱线图数据处理逻辑。dataTool是echarts自带的,无需额外安装,只要引入。 <template><span><div ref"BoxPlotChart" id&qu…...
SpringBoot编写一个SpringTask定时任务的方法
1,在启动类上添加注解 EnableScheduling//开启定时任务调度 2, 任务(方法)上也要添加注解: Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域: 秒 分 时 日 月 周 (年&#…...
【Qt编译】ARM环境 Qt5.14.2-QtWebEngine库编译 (完整版)
ARM 编译Qt5.14.2源码 1.下载源码 下载Qt5.14.2源代码(可根据自己的需求下载不同版本) 下载网站:https://download.qt.io/new_archive/qt/5.14/5.14.2/single/ 2.相关依赖(如果需要的话) 先参考官方文档的需求进行安装: 官方…...
vue简单使用二(循环)
目录 属性绑定 if判断: for循环: 属性绑定 代码的形式来说明 三元表达式的写法: if判断: for循环: 完整代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"…...
JavaScript入门--变量
JavaScript入门--变量 一、JS变量二、变量命名三、常量四、局部变量 一、JS变量 定义变量a, b, c,并输出到控制台。 var a 1; var b 13.14; var c hello Js;console.log(a, b, c) //console.log()语句用于输出结果到控制台,类似python的print语句…...
给自己的机器人部件安装单目摄像头并实现gazebo仿真功能
手术执行器添加摄像头 手术执行器文件夹surgical_new内容展示如何添加单目摄像头下载现成的机器人环境文件启动仿真环境 手术执行器文件夹surgical_new内容展示 进入src文件夹下选择进入vision_obliquity文件夹 选择launch 有两个可用gazebo中rviz展示的launch文件࿰…...
用AI的视角看世界
前言 2024年将是Ai人工智能在各个行业垂直领域发展的元年。 随着2022年11月openai 的大语言模型chatgpt3.5的诞生,已经预示着互联网时代,移动互联网时代即将迎来新的变革,也预示着web3.0和元宇宙更近了一步。 回顾历史,互联网的…...
MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)
MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…...
拯救鲨鱼!Helping wireshark!wireshark未响应解决方法
前言 做题的的时候 在用wireshark解密tls秘钥的时候 我的小鲨鱼突然未响应了 然后我多次尝试无果 并且殃及池鱼 我电脑上所有的流量包都打不开了?!!! 于是乎 尝试删了重下 还是未响应 开始怀疑电脑 重启电脑两次 还是打…...
设计模式之责任链讲解
责任链模式适用于需要将请求和处理解耦的场景,同时又需要动态地组织处理逻辑的场景。 通过使用责任链模式,可以实现请求的动态处理、灵活的扩展和简化的代码编写,提高系统的可维护性和可扩展性。 一、责任链入门 以下这是GPT生成的责任链代…...
K8s: 将一个节点移出集群和相关注意事项
前置步骤 在Kubernetes集群中,要移出一个节点,你需要执行以下步骤: 1 )将节点标记为不可调度 首先,你需要将目标节点标记为不可调度,以确保Kubernetes不会在该节点上调度新的Pod这可以通过执行以下命令实…...
Python学习笔记24 - 学生信息管理系统
1. 需求分析 2. 系统设计 3. 系统开发必备 4. 主函数设计 5. 学生信息维护模块设计 a. 录入学生信息 b. 删除学生信息 c. 修改学生信息 d. 查询学生信息 e. 统计学生总人数 f. 显示所有学生信息 g. 排序模块设计 6. 项目打包...
【物联网应用案例】某制造企业电锅炉检测项目
供暖行业在我国的经济发展中占据着重要的地位,然而,长期以来,该行业存在着自动化水平低、管理效率不高等问题,制约了其持续发展。为了解决这些问题,吉林某电锅炉生产厂家进行了一项创新性的尝试。 该厂家通过集成物联…...
设计模式实践
结合设计模式概念和在java/spring/spring boot中的实战,说明下列设计模式。 一、工厂模式 这里只讲简单工厂模式,详细的可以参考Java工厂模式(随笔)-CSDN博客。工厂类会根据不同的参数或条件来决定创建哪种对象,这样…...
嵌入式学习52-ARM1
知识零散: 1.flash: nor flash 可被寻地址 …...
Java(MySQL基础)
数据库相关概念 MySOL数据库 关系型数据库(RDBMS) 概念: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。特点: 使用表存储数据,格式统一,便于维护使用SQL语言操作,标准统一,使用方便 SQL SOL通用语法…...
预约系统的使用
预约系统的使用 目录概述需求: 设计思路实现思路分析1.用户年规则 在 预约系统中的使用流程 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wa…...
酷开科技OTT大屏营销:开启新时代的营销革命
随着互联网技术的不断发展和普及,大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下,酷开科技凭借其强大的技术实力和敏锐的市场洞察力,成功地将大屏转化为一种新的营销渠道,为品牌和企业带来了前所未有的商业机会。 酷开科技…...
网络安全(防火墙,IDS,IPS概述)
问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…...
安装IntelliJ IDEA插件教程
安装IntelliJ IDEA插件:一份详细指南 在提升IntelliJ IDEA开发效率的过程中,插件扮演着不可或缺的角色。它们为IDE提供了额外的功能和工具,以满足开发者在特定编程语言、框架、测试、版本控制等方面的个性化需求。本文将为您详细阐述如何在I…...
大厂基础面试题(之四)
Q1:请先进行自我介绍 Q2:说下你学习前端的详细过程 Q3:一个页面从url输入到显示页面的整个过程 1.URL解析 2.DNS解析 3.建立TCP连接 4.发起HTTP请求 5.服务器处理请求 6.返回HTTP响应 7.下载页面资源 8.解析和渲染页面 9.JavaScript执行 10…...
为什么我们应该切换到Rust
What is RUST? 什么是Rust? Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C, but it provides memory safety without usi…...
基于Linux定时任务实现的MySQL周期性备份
1、创建备份目录 sudo mkdir -p /var/backups/mysql/database_name2、创建备份脚本 sudo touch /var/backups/mysql/mysqldump.sh# 用VIM编辑脚本文件,写入备份命令 sudo vim /var/backups/mysql/mysqldump.sh# 内如如下 #!/bin/bash mysqldump -uroot --single-…...
【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)
使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线(例如电源类),你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器,在Net Classes中右击添加类,并重命名(例如为“Power”࿰…...
【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~
Git教程 版本标签(tag) 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交🌾 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …...
MemberPress配置和使用会员登录页面
目录 隐藏 创建会员登录页面 编辑登录页面 设计您的登录页面 链接到您的登录页面 创建会员登录页面 要创建MemberPress会员登录页面,您需要做的就是导航到 MemberPress > 设置 > 页面选项卡,然后在页面顶部附近的“MemberPress 登录页面”…...
动态网站开发的技术有/电脑培训网
本文为翻译文章,原文地址 这里欢迎来到本人对于Java 8的系列介绍教程,本教程会引导你一步步领略最新的语法特性。通过一些简单的代码示例你即可以学到默认的接口方法、Lambda表达式、方法引用以及重复注解等等。本文的最后还提供了譬如Stream API之类的详…...
合肥做公司网站一般多少钱/抖音seo排名
2019独角兽企业重金招聘Python工程师标准>>> 随着公司近几年所开拓的业务领域不断增强,同时也需要相应的业务软件平台作为后台支持,因此,信息中心所设计开发的软件规模近几年增长速度也很快。随之而来的数据库的容量和复杂程度也成…...
艺术字体转换器/新区快速seo排名
1、监理单位的体系建设分为哪3部分?答:①业务体系建设、②质保体系建设、③管理体系建设2、监理单位监理服务质量管理的方式有2种,哪2种?优缺点是什么?答:①以单位管理、②以监理项目部自我管理单位管理的优…...
专业营销网站带客/seo是什么公司
小记:最近由于远程安装oracle需要使用到图形界面,而服务器又不再本地。于是想到了远程操作centos的桌面。环境:centos6.0x64,Xmanager V4,VNC接下来就分别介绍两种工具的操作和联系方式:第一部分Xmanager&a…...
wordpress会员页面/金华seo
学了C基本的语法都知道继承可以让子类拥有更多的功能,除了继承还有组合,委托,也能让一个类的功能增加。设计模式,这个设计是设计继承,组合,委托,之间相互叠加的方式,让其符合业务需求…...
wordpress个性化友情链接页面/网站建设开发公司
上一篇博客:数据类型转换、ASCII编码 目录 算术运算符赋值运算符比较运算符逻辑运算符三元运算符 开始 算术运算符 算数运算符包括: 加法运算,字符串连接运算 - 减法运算 * 乘法运算 / 除法运算 % 取模运算,两…...