当前位置: 首页 > 编程日记 > 正文

NEON在Android中的使用举例

1、  打开Eclipse,File-->New-->AndroidApplication Project-->Application Name:Hello-Neon, Project Name: Hello-Neon,Package Name:com.hello_neon.android, Minimum Required SDK:API 9:Android 2.3(Gingerbread),Next-->去掉Create custom launcher icon的勾选,Next-->Next-->ActivityName:Hello_NeonProjectActivity,Finish.

2、  打开Hello-Neon工程下的src-->com.hello_neon.android-->Hello_NeonProjectActivity.java,将其内容改为:

package com.hello_neon.android;import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;public class Hello_NeonProjectActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);/* Create a TextView and set its content.* the text is retrieved by calling a native function.*/TextView  tv = new TextView(this);tv.setText( stringFromJNI() );setContentView(tv);}/* A native method that is implemented by the* 'helloneon' native library, which is packaged with this application.*/public native String  stringFromJNI();/* this is used to load the 'helloneon' library on application* startup. The library has already been unpacked into* /data/data/com.example.neon/lib/libhelloneon.so at* installation time by the package manager.*/static {System.loadLibrary("helloneon");}}

3、 保存Hello_NeonProjectActivity.java文件,打开命令行窗口,将其定位到\bin\classes目录下,输入命令:javah –classpath D:\ProgramFiles\Android\android-sdk\platforms\android-9\android.jar;com.hello_neon.android.Hello_NeonProjectActivity ,会在\bin\classes目录下生成com_hello_neon_android_Hello_NeonProjectActivity.h文件(说明:*.jar也可以是其它版本);

4、  选中Hello-Neon工程,点击右键-->New-->Folder新建一个jni文件夹,在此文件夹下添加Android.mk、Application.mk、helloneon.c、helloneon-intrinsics.c、helloneon-intrinsics.h五个文件,其中内容分别为:

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := helloneon#填写要编译的源文件路径
LOCAL_SRC_FILES := helloneon.c helloneon-intrinsics.c#默认包含的头文件路径
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..#-g 后面的一系列项目添加了才能使用arm_neon-h头文件, -mfloat-abi=softfp -mfpu=neon 使用arm_neon.h必须
LOCAL_CFLAGS := -g -mfloat-abi=softfp -mfpu=neon -march=armv7-a -mtune=cortex-a8LOCAL_LDLIBS := -lz -llog
TARGET_ARCH_ABI := armeabi-v7a 
LOCAL_ARM_MODE := armifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
#采用NEON优化技术LOCAL_ARM_NEON := true#LOCAL_CFLAGS := -DHAVE_NEON=1
endifLOCAL_STATIC_LIBRARIES := cpufeatures#生成动态调用库
include $(BUILD_SHARED_LIBRARY)$(call import-module,cpufeatures)

Application.mk:

APP_PROJECT_PATH := $(call my-dir)/..
APP_PLATFORM := android-10
#choose which library to compile against in your Makefile
APP_STL := stlport_static
#APP_ABI这句指定了编译的目标平台类型,可以针对不同平台进行优化,x86 or armeabi-v7a
# Build both ARMv5TE and ARMv7-A machine code.
APP_ABI := armeabi armeabi-v7a
APP_CPPFLAGS += -fexceptions
#for using c++ features,you need to enable these in your Makefile
APP_CPP_FEATURES += exceptions rtti

helloneon.c:

#include <jni.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <cpu-features.h>
#include "helloneon-intrinsics.h"#define DEBUG 0
#define HAVE_NEON#if DEBUG
#include <android/log.h>
#  define  D(x...)  __android_log_print(ANDROID_LOG_INFO,"helloneon",x)
#else
#  define  D(...)  do {} while (0)
#endif/* return current time in milliseconds */
static double
now_ms(void)
{struct timespec res;clock_gettime(CLOCK_REALTIME, &res);return 1000.0*res.tv_sec + (double)res.tv_nsec/1e6;
}/* this is a FIR filter implemented in C */
static void
fir_filter_c(short *output, const short* input, const short* kernel, int width, int kernelSize)
{int  offset = -kernelSize/2;int  nn;for (nn = 0; nn < width; nn++) {int sum = 0;int mm;for (mm = 0; mm < kernelSize; mm++) {sum += kernel[mm]*input[nn+offset+mm];}output[nn] = (short)((sum + 0x8000) >> 16);}
}#define  FIR_KERNEL_SIZE   32
#define  FIR_OUTPUT_SIZE   2560
#define  FIR_INPUT_SIZE    (FIR_OUTPUT_SIZE + FIR_KERNEL_SIZE)
#define  FIR_ITERATIONS    600static const short  fir_kernel[FIR_KERNEL_SIZE] = {0x10, 0x20, 0x40, 0x70, 0x8c, 0xa2, 0xce, 0xf0, 0xe9, 0xce, 0xa2, 0x8c, 070, 0x40, 0x20, 0x10,0x10, 0x20, 0x40, 0x70, 0x8c, 0xa2, 0xce, 0xf0, 0xe9, 0xce, 0xa2, 0x8c, 070, 0x40, 0x20, 0x10 };static short        fir_output[FIR_OUTPUT_SIZE];
static short        fir_input_0[FIR_INPUT_SIZE];
static const short* fir_input = fir_input_0 + (FIR_KERNEL_SIZE/2);
static short        fir_output_expected[FIR_OUTPUT_SIZE];/* This is a trivial JNI example where we use a native method* to return a new VM String. See the corresponding Java source* file located at:**   apps/samples/hello-neon/project/src/com/example/neon/HelloNeon.java*/
JNIEXPORT jstring JNICALL Java_com_hello_1neon_android_Hello_1NeonProjectActivity_stringFromJNI(JNIEnv *env, jobject thiz)
{char*  str;uint64_t features;char buffer[512];char tryNeon = 0;double  t0, t1, time_c, time_neon;/* setup FIR input - whatever */{int  nn;for (nn = 0; nn < FIR_INPUT_SIZE; nn++) {fir_input_0[nn] = (5*nn) & 255;}fir_filter_c(fir_output_expected, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}/* Benchmark small FIR filter loop - C version */t0 = now_ms();{int  count = FIR_ITERATIONS;for (; count > 0; count--) {fir_filter_c(fir_output, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}}t1 = now_ms();time_c = t1 - t0;asprintf(&str, "FIR Filter benchmark:\nC version          : %g ms\n", time_c);strlcpy(buffer, str, sizeof buffer);free(str);strlcat(buffer, "Neon version   : ", sizeof buffer);if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM) {strlcat(buffer, "Not an ARM CPU !\n", sizeof buffer);goto EXIT;}features = android_getCpuFeatures();if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7) == 0) {strlcat(buffer, "Not an ARMv7 CPU !\n", sizeof buffer);goto EXIT;}/* HAVE_NEON is defined in Android.mk ! */
#ifdef HAVE_NEONif ((features & ANDROID_CPU_ARM_FEATURE_NEON) == 0) {strlcat(buffer, "CPU doesn't support NEON !\n", sizeof buffer);goto EXIT;}/* Benchmark small FIR filter loop - Neon version */t0 = now_ms();{int  count = FIR_ITERATIONS;for (; count > 0; count--) {fir_filter_neon_intrinsics(fir_output, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}}t1 = now_ms();time_neon = t1 - t0;asprintf(&str, "%g ms (x%g faster)\n", time_neon, time_c / (time_neon < 1e-6 ? 1. : time_neon));strlcat(buffer, str, sizeof buffer);free(str);/* check the result, just in case */{int  nn, fails = 0;for (nn = 0; nn < FIR_OUTPUT_SIZE; nn++) {if (fir_output[nn] != fir_output_expected[nn]) {if (++fails < 16)D("neon[%d] = %d expected %d", nn, fir_output[nn], fir_output_expected[nn]);}}D("%d fails\n", fails);}
#else /* !HAVE_NEON */strlcat(buffer, "Program not compiled with ARMv7 support !\n", sizeof buffer);
#endif /* !HAVE_NEON */
EXIT:return (*env)->NewStringUTF(env, buffer);
}

helloneon-intrinsics.h:

#ifndef HELLONEON_INTRINSICS_H
#define HELLONEON_INTRINSICS_Hvoid fir_filter_neon_intrinsics(short *output, const short* input, const short* kernel, int width, int kernelSize);#endif /* HELLONEON_INTRINSICS_H */

helloneon-intrinsics.c:

#include "helloneon-intrinsics.h"
#include <arm_neon.h>/* this source file should only be compiled by Android.mk when targeting* the armeabi-v7a ABI, and should be built in NEON mode*/
void
fir_filter_neon_intrinsics(short *output, const short* input, const short* kernel, int width, int kernelSize)
{
#if 1int nn, offset = -kernelSize/2;for (nn = 0; nn < width; nn++){int mm, sum = 0;int32x4_t sum_vec = vdupq_n_s32(0);for(mm = 0; mm < kernelSize/4; mm++){int16x4_t  kernel_vec = vld1_s16(kernel + mm*4);int16x4_t  input_vec = vld1_s16(input + (nn+offset+mm*4));sum_vec = vmlal_s16(sum_vec, kernel_vec, input_vec);}sum += vgetq_lane_s32(sum_vec, 0);sum += vgetq_lane_s32(sum_vec, 1);sum += vgetq_lane_s32(sum_vec, 2);sum += vgetq_lane_s32(sum_vec, 3);if(kernelSize & 3){for(mm = kernelSize - (kernelSize & 3); mm < kernelSize; mm++)sum += kernel[mm] * input[nn+offset+mm];}output[nn] = (short)((sum + 0x8000) >> 16);}
#else /* for comparison purposes only */int nn, offset = -kernelSize/2;for (nn = 0; nn < width; nn++) {int sum = 0;int mm;for (mm = 0; mm < kernelSize; mm++) {sum += kernel[mm]*input[nn+offset+mm];}output[nn] = (short)((sum + 0x8000) >> 16);}
#endif
}

5、 利用NDK生成.so文件:选中工程-->Properties-->Builders-->New-->选中Program-->OK,Name:Hello_Neon_Builder,Location: D:\ProgramFiles\Android\android-sdk\android-ndk-r9\ndk-build.cmd,Working Directory: E:\NEON\Eclipse\Hello-Neon -->Apply,选中Refresh,勾选Refreshresources upon completion, 勾选Specific resources,点击Specify Resources…,勾选Hello-Neon工程下的libs文件夹,Finish-->Apply,选中BuildOptions,勾选Allocate Console(necessary for input), After a “Clean”, During manualbuilds, During auto builds, Specify working set of relevant resources,点击SpecifyResoures…,勾选Hello-Neon工程下的jni文件夹,Finish-->Apply-->OK-->OK,会在libs文件夹下生成libhelloneon.so文件;

6、  选中Hello-Neon,-->Run As-->AndroidApplication,运行结果为:

FIRFilter benchmark:

C version       :282.84 ms

Neon version    :135985 ms(x2.07994 faster)

以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:

1、将Android.mk改为:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := helloneon#填写要编译的源文件路径
LOCAL_SRC_FILES := helloneon.cpp helloneon-intrinsics.cpp#默认包含的头文件路径
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..#-g 后面的一系列项目添加了才能使用arm_neon-h头文件, -mfloat-abi=softfp -mfpu=neon 使用arm_neon.h必须
LOCAL_CFLAGS := -g -mfloat-abi=softfp -mfpu=neon -march=armv7-a -mtune=cortex-a8LOCAL_LDLIBS := -lz -llog
TARGET_ARCH_ABI := armeabi-v7a 
LOCAL_ARM_MODE := armifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
#采用NEON优化技术LOCAL_ARM_NEON := true#LOCAL_CFLAGS := -DHAVE_NEON=1
endifLOCAL_STATIC_LIBRARIES := cpufeatures#生成动态调用库
include $(BUILD_SHARED_LIBRARY)$(call import-module,cpufeatures)

2、helloneon.c改为:

#include <jni.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <cpu-features.h>
#include "helloneon-intrinsics.h"#define DEBUG 0
#define HAVE_NEON#ifdef __cplusplus
extern "C" {
#endif#if DEBUG
#include <android/log.h>
#  define  D(x...)  __android_log_print(ANDROID_LOG_INFO,"helloneon",x)
#else
#  define  D(...)  do {} while (0)
#endif/* return current time in milliseconds */
static double
now_ms(void)
{struct timespec res;clock_gettime(CLOCK_REALTIME, &res);return 1000.0*res.tv_sec + (double)res.tv_nsec/1e6;
}/* this is a FIR filter implemented in C */
static void
fir_filter_c(short *output, const short* input, const short* kernel, int width, int kernelSize)
{int  offset = -kernelSize/2;int  nn;for (nn = 0; nn < width; nn++) {int sum = 0;int mm;for (mm = 0; mm < kernelSize; mm++) {sum += kernel[mm]*input[nn+offset+mm];}output[nn] = (short)((sum + 0x8000) >> 16);}
}#define  FIR_KERNEL_SIZE   32
#define  FIR_OUTPUT_SIZE   2560
#define  FIR_INPUT_SIZE    (FIR_OUTPUT_SIZE + FIR_KERNEL_SIZE)
#define  FIR_ITERATIONS    600static const short  fir_kernel[FIR_KERNEL_SIZE] = {0x10, 0x20, 0x40, 0x70, 0x8c, 0xa2, 0xce, 0xf0, 0xe9, 0xce, 0xa2, 0x8c, 070, 0x40, 0x20, 0x10,0x10, 0x20, 0x40, 0x70, 0x8c, 0xa2, 0xce, 0xf0, 0xe9, 0xce, 0xa2, 0x8c, 070, 0x40, 0x20, 0x10 };static short        fir_output[FIR_OUTPUT_SIZE];
static short        fir_input_0[FIR_INPUT_SIZE];
static const short* fir_input = fir_input_0 + (FIR_KERNEL_SIZE/2);
static short        fir_output_expected[FIR_OUTPUT_SIZE];/* This is a trivial JNI example where we use a native method* to return a new VM String. See the corresponding Java source* file located at:**   apps/samples/hello-neon/project/src/com/example/neon/HelloNeon.java*/
JNIEXPORT jstring JNICALL Java_com_hello_1neon_android_Hello_1NeonProjectActivity_stringFromJNI(JNIEnv *env, jobject thiz)
{char str[512] = {0};uint64_t features;char buffer[512];char tryNeon = 0;double  t0, t1, time_c, time_neon;/* setup FIR input - whatever */{int  nn;for (nn = 0; nn < FIR_INPUT_SIZE; nn++) {fir_input_0[nn] = (5*nn) & 255;}fir_filter_c(fir_output_expected, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}/* Benchmark small FIR filter loop - C version */t0 = now_ms();{int  count = FIR_ITERATIONS;for (; count > 0; count--) {fir_filter_c(fir_output, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}}t1 = now_ms();time_c = t1 - t0;sprintf(str, "FIR Filter benchmark:\nC version          : %g ms\n", time_c);strlcpy(buffer, str, sizeof buffer);strlcat(buffer, "Neon version   : ", sizeof buffer);if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM) {strlcat(buffer, "Not an ARM CPU !\n", sizeof buffer);goto EXIT;}features = android_getCpuFeatures();if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7) == 0) {strlcat(buffer, "Not an ARMv7 CPU !\n", sizeof buffer);goto EXIT;}/* HAVE_NEON is defined in Android.mk ! */
#ifdef HAVE_NEONif ((features & ANDROID_CPU_ARM_FEATURE_NEON) == 0) {strlcat(buffer, "CPU doesn't support NEON !\n", sizeof buffer);goto EXIT;}/* Benchmark small FIR filter loop - Neon version */t0 = now_ms();{int  count = FIR_ITERATIONS;for (; count > 0; count--) {fir_filter_neon_intrinsics(fir_output, fir_input, fir_kernel, FIR_OUTPUT_SIZE, FIR_KERNEL_SIZE);}}t1 = now_ms();time_neon = t1 - t0;sprintf(str, "%g ms (x%g faster)\n", time_neon, time_c / (time_neon < 1e-6 ? 1. : time_neon));strlcat(buffer, str, sizeof buffer);/* check the result, just in case */{int  nn, fails = 0;for (nn = 0; nn < FIR_OUTPUT_SIZE; nn++) {if (fir_output[nn] != fir_output_expected[nn]) {if (++fails < 16)D("neon[%d] = %d expected %d", nn, fir_output[nn], fir_output_expected[nn]);}}D("%d fails\n", fails);}
#else /* !HAVE_NEON */strlcat(buffer, "Program not compiled with ARMv7 support !\n", sizeof buffer);
#endif /* !HAVE_NEON */
EXIT:return env->NewStringUTF(buffer);
}#ifdef __cplusplus
}
#endif


参考文献:

1、  http://blog.csdn.net/fengbingchun/article/details/11580983

2、  android-ndk-r9-windows-x86_64中的hello-neon例子代码


相关文章:

Android中的JSON详细总结

1、JSON(JavaScript Object Notation) 定义&#xff1a; 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式&#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从…

新一届最强预训练模型上榜,出于BERT而胜于BERT

作者 | Facebook AI译者 | Lucy编辑 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】预训练方法设计有不同的训练目标&#xff0c;包括语言建模、机器翻译以及遮蔽语言建模等。最近发表的许多论文都使用了微调模型&#xff0c;并预先训练了一些遮蔽语…

Ubuntu 32下Android NDK+NEON的配置过程及简单使用举例

1、 利用VMware在Windows7 64位下安装Ubuntu13.10 32位虚拟机&#xff1b; 2、 从 https://developer.android.com/tools/sdk/ndk/index.html下载android-ndk32-r10-linux-x86.tar.bz2&#xff1b; 3、 将android-ndk32-r10-linux-x86.tar.bz2拷贝到Ubuntu的/home/spring/NE…

Neon Intrinsics各函数介绍

#ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abisoftfp -mfpuneon) to use arm_neon.h #endif/*(1)、正常指令&#xff1a;生成大小相同且类型通常与操作数向量相同的结果向量&#xff1b; (2)、长指令&#xff1a;对双字向量操作数执行运算…

ubuntu bind9 配置简单记录

ubuntu bind9 配置简单记录ubuntu版本&#xff1a;Ubuntu 12.04.2bind9安装&#xff1a;apt-get install bind9bind9配置文件目录&#xff1a;/etc/bindbind9主要配置文件&#xff1a;named.conf.local以及对应db配置1&#xff0c;主服务器配置&#xff1a;rootubuntu:/etc/bin…

不止最佳长论文,腾讯AI在ACL上还有这些NLP成果

编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】7 月 31 日晚&#xff0c;自然语言处理领域最大顶会 ACL 2019 公布了今年的八个论文奖项&#xff0c;其中最佳长论文的获奖者被来自中国科学院大学、中国科学院计算技术研究所、腾讯 We…

python中package机制的两种实现方式(转载)

当执行import module时&#xff0c;解释器会根据下面的搜索路径&#xff0c;搜索module1.py文件。 1) 当前工作目录 2) PYTHONPATH中的目录 3) Python安装目录 (/usr/local/lib/python) 事实上&#xff0c;模块搜索是在保存在sys.path这个全局变量中的目录列表中进行搜索。 sys…

Magento如何使用和设置CookieSession

2019独角兽企业重金招聘Python工程师标准>>> 给大家介绍两个Magento的核心对象&#xff0d;Mage_Core_Model_Cookie & Mage_Core_Model_Session 首先介绍Mage_Core_Model_Cookie&#xff0c;这个对象主要是用来设置Cookie的&#xff0c;里面主要下列方法&#x…

AI+DevOps正当时

随着业务复杂化和人员的增加&#xff0c;开发人员和运维人员逐渐演化成两个独立的部门&#xff0c;他们工作地点分离&#xff0c;工具链不同&#xff0c;业务目标也有差异&#xff0c;这使得他们之间出现一条鸿沟。而发布软件就是将一个软件想从鸿沟的这边送去那边&#xff0c;…

clientdataset 用法

影响ClientDataSet处理速度的一个因素TClientDataSet是Delphi开发数据库时一个非常好的控件。有很强大的功能。我常常用ClientDataSet做MemoryDataSet来使用。还可以将ClientDataSet的数据保存为XML&#xff0c;这样就可以做简单的本地数据库使用。还有很多功能就不多说了。在使…

用vs2010编译vigra静态库及简单使用举例

1、 从 http://ukoethe.github.io/vigra/ 下载最新源代码vigra-1.10.0-src-with-docu.tar.gz&#xff0c;并加压缩到D:\soft\vigra&#xff0c;生成vigra-1.10.0文件夹&#xff1b; 2、 从http://www.cmake.org/cmake/resources/software.html下载CMake并安装&#xff1b; …

39个超实用jQuery实例应用特效

2019独角兽企业重金招聘Python工程师标准>>> 1.Contextual Slideout&#xff1a;上下文滑动特效 2.Revealing Photo Slider&#xff1a;图片幻灯片特效 3.Fancy Box&#xff1a;魔幻盒 4.Scrollable&#xff1a;滚动特效 5.Flip&#xff1a;翻转特效,实现4个方向…

Android.mk和Application.mk文件语法规范说明及举例

以下英文内容摘自&#xff1a;http://www.kandroid.org/ndk/docs/OVERVIEW.html The Android NDK is a set of tools that allows Android application developers to embed native machine code compiled from C and/or C source files into their application packages.NDK d…

ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API。 新建项目&#xff0c;选择"ASP.NET MVC 4 Web应用程序"。 选择"基本"项目模版。 在Controllers文件夹下添加一个名称为"TestController"的空API控制器。 在引用文件夹中多了以下…

滴滴自动驾驶部门成立独立公司,CTO张博兼任新公司CEO

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;8 月 5 日&#xff0c;滴滴出行官方微信公众号发文&#xff0c;宣布旗下自动驾驶部门升级为独立公司。目前&#xff0c;新成立公司的名称还未曝光&#xff0c;但据官方介绍将专注于自动驾驶…

在ASP.NET MVC下实现树形导航菜单

在需要处理很多分类以及导航的时候&#xff0c;树形导航菜单就比较适合。例如在汽车之家上&#xff1a; 页面主要分两部分&#xff0c;左边是导航菜单&#xff0c;右边显示对应的内容。现在&#xff0c;我们就在ASP.NET MVC 4 下临摹一个&#xff0c;如下&#xff1a; 实现的效…

mongodb学习笔记6--杂项与补充

2019独角兽企业重金招聘Python工程师标准>>> 1。适用场景&#xff1a;持久化缓存层&#xff0c;高效的时效性&#xff0c;用于对象和Json数据的存储&#xff0c;高伸缩性的场景&#xff0c;大尺寸&#xff0c;低价值的数据存储。 不适用&#xff1a;高度事务性的场景…

GraphSAGE:我寻思GCN也没我厉害!

作者 | 郭必扬来源 | SimpleAI&#xff08;ID:SimpleAI_1&#xff09;众所周知&#xff0c;2017年ICLR出产的GCN现在是多么地热门&#xff0c;仿佛自己就是图神经网络的名片。然而&#xff0c;在GCN的风头中&#xff0c;很多人忽略了GCN本身的巨大局限——Transductive Learnin…

CxImage的编译及简单使用举例

1、 从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码&#xff1b; 2、 解压缩后&#xff0c;以管理员身份打开CxImageFull_vc10.sln工程&#xff0c;在编译之前先将每个工程属性的Character Set由原先的Use Unicode Character Set改为Use Multi-ByteC…

如何使用好android的可访问性服务(Accessibility Services)

原文&#xff1a;http://android.eoe.cn/topic/android_sdk * 主题* Manifest声明和权限 可访问性服务声明 可访问性服务配置 AccessibilityService方法 获得事件细节 示例代码 主要的类*AccessibilityService AccessibilityServiceInfo AccessibilityEvent AccessibilityReco…

自动驾驶人的福音!Lyft公开Level 5部署平台Flexo细节

作者 | Mathias Gug等&#xff0c;Lyft Level 5 软件工程师译者 | Lucy编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;经过一年半的 bootstrapping&#xff08;一种再抽样统计方法&#xff09;&#xff0c;Lyft 让 Level 5 实现区分非常…

Cygwin的安装及在Android jni中的简单使用举例

Cygwin是一个在windows平台上运行的类UNIX模拟环境&#xff0c;是cygnussolutions公司开发的自由软件。Cygwin是许多自由软件的集合&#xff0c;Cygwin的主要目的是通过重新编译&#xff0c;将POSIX系统上的软件移植到Windows上。Cygwin包括了一套库&#xff0c;该库在win32系统…

university, school, college, department, institute的区别

这些个词没有太大区别&#xff0c;有时候有些词是可以通用的&#xff0c;而有些用法则是随着地域时间的不同而变迁。一般说来&#xff0c;college译作“学院”&#xff0c;它是university &#xff08;综合性大学&#xff09;的一个组成部分&#xff0c;例如&#xff0c;一所综…

XML简介及举例

可扩展标记语言(eXtensibleMarkup Language&#xff0c;简称XML)&#xff0c;是一种标记语言。标记指计算机所能理解的信息符号&#xff0c;通过此种标记&#xff0c;计算机之间可以处理包含各种信息的文章等。如何定义这些标记&#xff0c;既可以选择国际通用的标记语言&#…

关于事务的传播特性和隔离级别的问题

REQUIRED&#xff1a;业务方法需要在一个事务中运行。如果方法运行时&#xff0c;已经处在一个事务中&#xff0c;那么加入到该事务&#xff0c;否则为自己创建一个新的事务。 NOT_SUPPORTED&#xff1a;声明方法不需要事务。如果方法没有关联到一个事务&#xff0c;容器不会为…

[Big Data - Kafka] kafka学习笔记:知识点整理

一、为什么需要消息系统 1.解耦&#xff1a; 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 2.冗余&#xff1a;消息队列把数据进行持久化直到它们已经被完全处理&#xff0c;通过这一方式规避了数据丢失风险。许多消息队列所采用的&q…

自然语言处理十问!独家福利

最近&#xff0c;NLP 圈简直不要太热闹&#xff01;预训练模型频频刷新榜单&#xff0c;让一众研究者、开发者“痛并快乐着”。自 2018 年 10 月&#xff0c;Google 提出 BERT 以来&#xff0c;NLP 领域预训练模型的发展仿佛坐上了火箭&#xff0c;完全控制不住。BERT 出世前&a…

BERT的成功是否依赖于虚假相关的统计线索?

作者 | 李理来源 | 个人博客导读&#xff1a;本文介绍论文Probing Neural Network Comprehension of Natural Language Arguments&#xff0c;讨论BERT在ACRT任务下的成绩是否依赖虚假的统计线索&#xff0c;同时分享一些个人对目前机器学习尤其是自然语言理解的看法。目录论文…

【电子基础】模拟电路问答

模拟电路基础知识问答整理 mystery 1、温度对半导体材料的导电性能有什么影响? 答&#xff1a;温度对半导体的导电性能有很大影响。当温度升高时&#xff0c;半导体材料内的自由电子和空穴数量迅速增加&#xff0c;半导体的导电性能将迅速提高。 2、什么是本征半导体和杂质半导…

XML解析简介及Xerces-C++简单使用举例

XML是由World WideWeb联盟(W3C)定义的元语言。它已经成为一种通用的数据交换格式&#xff0c;它的平台无关性&#xff0c;语言无关性&#xff0c;系统无关性&#xff0c;给数据集成与交互带来了极大的方便。XML在不同的语言里解析方式都是一样的&#xff0c;只不过实现的语法不…