C++矢量运算与java矢量运算

矢量运算

概述

矢量运算是一种基于向量的数学运算,它遵循特定的法则。以下是矢量运算的一些基本原理:

  • 矢量加法:可以使用平行四边形法则或三角形法则来执行。当两个矢量相加时,可以将它们的起点放在同一个点上,然后根据平行四边形法则,从这两个矢量的尾部画两条线,使其首尾相连,形成一个平行四边形。这个平行四边形的对角线即表示两矢量之和。如果使用三角形法则,则是将一个矢量的尾部与另一个矢量的头部相连,形成三角形,再从第一个矢量的起点到第二个矢量的尾部画一条线,这条线代表两矢量之和。
  • 矢量减法:被视作矢量加法的逆运算。从一个矢量中减去另一个矢量相当于加上那个矢量的负矢量。
  • 矢量与标量乘法:将矢量的每个分量乘以标量即可。几何意义上,一个矢量乘以正标量会使得矢量在保持方向不变的情况下扩大若干倍,而乘以负标量则会使矢量的方向反转并等比例缩小。
  • 矢量共线定理:表明如果两个矢量共线,那么其中一个矢量可以表示为另一个矢量与一个标量的乘积。

矢量运算比标量快的原因

  1. 并行性(Parallelism):矢量化操作可以同时对多个数据元素执行相同的操作。现代处理器中的矢量处理单元(如SSE、AVX指令集)可以在单个指令中对多个数据元素执行相同的操作,从而实现并行计算。相比之下,标量操作则需要逐个处理每个数据元素,无法充分利用处理器的并行计算能力。

  2. 数据局部性(Data Locality):矢量化操作可以提高数据的局部性,减少内存访问次数。由于矢量操作一次处理多个数据元素,可以更有效地利用处理器的缓存,降低了内存访问的开销。而标量操作需要对每个数据元素分别进行内存访问,导致更多的缓存未命中和内存带宽瓶颈。

  3. 指令优化(Instruction Optimization):矢量指令集(如SSE、AVX)提供了丰富的指令,能够对矢量数据进行高效的操作,包括加法、乘法、逻辑运算等。处理器可以利用这些指令进行更有效的优化,从而提高运算速度。相比之下,标量指令集的操作对象是单个数据元素,限制了处理器进行指令级并行优化的能力。

  4. 数据重用(Data Reuse):矢量化操作可以更好地利用数据重用的机会。在循环等迭代过程中,矢量化操作可以将多次计算相同的操作合并为一次计算,从而减少了重复计算的开销。而标量操作需要对每个数据元素分别进行计算,无法充分利用数据重用的机会。

C++矢量运算与标量运算的比较

#include <iostream>
#include <vector>
#include <chrono>int main() {std::vector<int> vec1 = {1, 2, 3};std::vector<int> vec2 = {4, 5, 6};std::vector<int> result(3);auto start = std::chrono::high_resolution_clock::now();for (size_t i = 0; i < vec1.size(); ++i) {result[i] = vec1[i] + vec2[i];}auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed = end - start;std::cout << "Vector addition time: " << elapsed.count() << " seconds" << std::endl;int scalar1 = 1;int scalar2 = 4;start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 3; ++i) {int scalar_result = scalar1 + scalar2;}end = std::chrono::high_resolution_clock::now();elapsed = end - start;std::cout << "Scalar addition time: " << elapsed.count() << " seconds" << std::endl;return 0;
}

运行结果:

java矢量运算与标量运算的比较

package org.cyl.spaceutils;import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;public class VectorScalarOperations {public static void main(String[] args) {// 定义矢量a和bfloat[] a = {1, 2, 3};float[] b = {4, 5, 6};float[] c=new float[a.length];VectorScalarOperations v1=new VectorScalarOperations();long startTime = System.nanoTime();v1.vectorComputation(a,b,c);long endTime = System.nanoTime();System.out.println("矢量花费的时间:"+(endTime-startTime));long startTime1 = System.nanoTime();v1.xadd(a,b,c);long endTime1 = System.nanoTime();System.out.println("标量花费的时间:"+(endTime1-startTime1));}static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;void vectorComputation(float[] a, float[] b, float[] c) {int i = 0;int upperBound = SPECIES.loopBound(a.length);for (; i < upperBound; i += SPECIES.length()) {// FloatVector va, vb, vc;var va = FloatVector.fromArray(SPECIES, a, i);var vb = FloatVector.fromArray(SPECIES, b, i);var vc = va.mul(va).add(vb.mul(vb));vc.intoArray(c, i);}}void xadd(float[]a,float[]b,float[]c){for (int i=0;i<a.length;i++){c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;}}
}

java的要大量数据才能展现出其价值。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朴素贝叶斯算法基础——案例:对新闻进行分类

贝叶斯公式 朴素&#xff1a;假设特征与特征之间相互独立 朴素贝叶斯算法&#xff1a;朴素贝叶斯 应用场景&#xff1a;文本分类&#xff08;单词作为特征&#xff09; 拉普拉斯平滑系数 Ni&#xff1a;F1词在C类别所有文档中出现的次数 N&#xff1a;所属类别C下的文档所…

华为车控面试前后

个人经历&#xff1a; 秋招未接受其他公司offer&#xff0c;all in华子。 ->秋招失败0 offer 年前被车bu捞后入池开始审批。 ->等待超过1个月&#xff0c;陷入煎熬。 ->终于等到意向书。 分享时间线&#xff1a; 10月 笔试和3面入池2012 1月 收到车bu捞人电话解…

JVM是如何运行的

JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是 Java 程序的运行环境&#xff0c;它负责将 Java 字节码翻译成机器代码并执行。也就是说 Java 代码之所以能够运行&#xff0c;主要是依靠 JVM 来实现的。 JVM 整体的大概执行流程是这样的&#xff1…

尚硅谷SpringBoot3笔记

推荐课程&#xff1a;03.快速入门-示例Demo_哔哩哔哩_bilibili 官方笔记&#xff1a;SpringBoot3全栈指南 (yuque.com) 目录 01 -- 示例demo 1. 在新建项目创建一个Maven 模块 2. 引入 spring-boot-starter-parent 和 spring-boot-starter-web 依赖 3. 指示 Spring Boot 启…

Spring多线程事务处理

一、背景 本文主要介绍了spring多线程事务的解决方案&#xff0c;心急的小伙伴可以跳过上面的理论介绍分析部分直接看最终解决方案。 在我们日常的业务活动中&#xff0c;经常会出现大规模的修改插入操作&#xff0c;比如在3.0的活动赛事创建&#xff0c;涉及到十几张表的插入…

doris安装(docker方式)

背景 doris有两个进程 fe,处理用户请求,查询,元数据管理,节点管理be,数据存储,查询计划执行 架构图如下: 参考:https://doris.apache.org/zh-CN/docs/get-starting/what-is-apache-doris 1、定义docker-compose文件 version: 3 services:docker-fe:image: "apac…

提升用户体验,Xinstall让微信内打开第三方APP更顺畅

在移动互联网时代&#xff0c;APP推广的重要性不言而喻。然而&#xff0c;推广过程中我们经常会遇到各种问题&#xff0c;比如用户在微信内无法直接打开第三方APP&#xff0c;导致推广效果大打折扣。那么&#xff0c;如何在微信内实现无缝跳转&#xff0c;提高推广效率呢&#…

Python使用错误总结

【1】cannot import name ‘ParameterSource’ from ‘click.core’ 其根本原因在于是black模块&#xff0c;其模块版本可能过时&#xff0c;升级black模块版本即可&#xff1a; pip install black --upgrade【2】partially initialized module ‘charset_normalizer’ has n…

利用Python实现每日新闻推送的简单逻辑【附接口】

本文将介绍如何使用Python编写简单的逻辑&#xff0c;通过调用API接口实现每日新闻推送功能。 步骤&#xff1a; 导入所需的库&#xff1a; 在代码的开头&#xff0c;我们需要导入所需的库。通常&#xff0c;我们会使用requests库来发送HTTP请求&#xff0c;以获取新闻数据。 …

Codeforces Round 933 (Div. 3) A~D

比赛链接 : codeforces.com/contest/1941 A . Rudolf and the Ticket 直接暴力即可 ; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \n #define lowbit(x) (x&(-x)) #define sz(a) (int)a.size() #define p…

2024年3月11日 算法刷题记录

2024年3月11日 习题 2.4 Repeater&#xff08;北京大学复试上机题&#xff09; 链接 题目大意 给你一个仅包含一种字符和空格的模板&#xff0c;模板显示如何创建无尽的图片&#xff0c;将字符用作基本元素并将它们放在正确的位置以形成更大的模板&#xff0c;然后不断进行…

AIPC的“名利场”,生产力革命还是市值猛药?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 苹果这回终于不“挤牙膏”了&#xff0c;急不可耐地扎入了AIPC的“名利场”。 就在2月28日&#xff0c;苹果CEO库克还在股东大会上宣称&#xff1a;“目前市面上用于人工智能的电脑&#xff0c;没有比Mac更好的”。仅一周过去&am…