在高级向量扩展(AVX)中,比较指令如_m256_cmp_ps,最后一个参数是比较谓词.谓词的选择压倒了我.它们似乎是类型,排序,信号的三重奏.例如_CMP_LE_OS是'小于或等于,有序,信令.
对于初学者来说,是否存在选择信令或非信令的性能原因,同样,有序或无序的速度比另一个更快?
什么'非信令'甚至意味着什么?我根本无法在文档中找到这个.任何关于何时选择什么的经验法则?
以下是avxintrin.h的谓词选择:
/* Compare */
#define _CMP_EQ_OQ 0x00 /* Equal (ordered, non-signaling) */
#define _CMP_LT_OS 0x01 /* Less-than (ordered, signaling) */
#define _CMP_LE_OS 0x02 /* Less-than-or-equal (ordered, signaling) */
#define _CMP_UNORD_Q 0x03 /* Unordered (non-signaling) */
#define _CMP_NEQ_UQ 0x04 /* Not-equal (unordered, non-signaling) */
#define _CMP_NLT_US 0x05 /* Not-less-than (unordered, signaling) */
#define _CMP_NLE_US 0x06 /* Not-less-than-or-equal (unordered, signaling) */
#define _CMP_ORD_Q 0x07 /* Ordered (nonsignaling) */
#define _CMP_EQ_UQ 0x08 /* Equal (unordered, non-signaling) */
#define …Run Code Online (Sandbox Code Playgroud) 当我使用matplotlib.pyplot.savefig("test.svg", format="svg")将图形导出为SVG时,生成的SVG文件非常庞大.
这是因为我的图中有很多文本注释,每个文本最终都是SVG中的路径.
我希望我的文本最终成为SVG中的文本字符串,而不是路径.如果文本字符串以这种方式导出,那么解释输出也变得太难了.
有没有办法强制matplotlib输出文本作为文本,而不是曲线?
目前,我在SVG文件中看到了这些代码片段:
<path d=" M9.8125 72.9062 L55.9062 72.9062 L55.9062 64.5938 L19.6719
64.5938 L19.6719 43.0156 L54.3906 43.0156 L54.3906 34.7188 L19.6719
34.7188 L19.6719 8.29688 L56.7812 8.29688 L56.7812 0 L9.8125 0 z "
id="DejaVuSans-45" />
Run Code Online (Sandbox Code Playgroud) 使用SSE,您可以将内存中的单个浮点数加载到__m128的所有4个插槽中,并使用内部_mm_load1_ps()
当使用带有AVX的256位宽SIMD时,似乎没有_mm256_load1_ps()将单个浮点数从存储器加载到向量的所有8个插槽中.
为什么会遗漏这个遗漏,最好的方法是什么呢?
或者甚至更好:有没有办法将单个浮点数加载到向量的目标槽0..7?
我在OSX上使用OpenGL3.2 Core Profile.我想做实例绘图(glDrawArraysInstanced),我为每个实例传递一个矩阵.
我的顶点着色器构建得很好:
#version 150
in mediump vec4 position;
in mediump mat4 trf;
in lowp vec4 rgb;
out lowp vec4 colour;
uniform highp mat4 modelcamviewprojmat;
void main()
{
mediump vec4 tpos = trf * position;
gl_Position = modelcamviewprojmat * tpos;
colour = rgb;
}
Run Code Online (Sandbox Code Playgroud)
'trf'的绑定很好:
glBindAttribLocation(program, ATTRIB_TRF, "trf" );
Run Code Online (Sandbox Code Playgroud)
但是我如何传递我的数据呢?glVertexAttribPointer无法传递大于4个浮点数的值.所以这个调用失败了:
glVertexAttribPointer( ATTRIB_TRF, 16, GL_FLOAT, 0, 16 * sizeof(float), ... );
Run Code Online (Sandbox Code Playgroud)
我怀疑我需要用4次调用glVertexAttribPointer来替换它,每次调用4次浮点数.但是我可以将什么价值用于'指数'(第一个参赛)?我是否需要使用4个向量属性,并在GLSL顶点着色器中组合四个向量?如果是这样,什么样的GLSL代码实现了这一点?或者我可以使用BindAttribLocation的返回值并对所有行使用val + 0,val + 1,val + 2和val + 3吗?
在英特尔 AVX 上,存在无分支代码的可能性。您可以计算这两种情况,并根据条件混合结果,而不是针对 case0 或 case1 进行分支。
AVX 使用vblendps指令以 8 种方式实现浮动。
您还可以使用 x86 指令CMOVcc以标量方式(无需向量)执行此操作,该指令有条件地执行移动操作。
RISCV64 可以做这样的标量移动吗,这样你就不必分支
a = c ? x : y;
Run Code Online (Sandbox Code Playgroud)
据我了解,RISCV 实现是有序的,因此在不需要分支时它比 x86 更有好处。(后者至少可以围绕一些指令进行洗牌,甚至可以推测性地分支以隐藏延迟。)
我能找到的最接近 riscv 的无分支操作是SLT(设置小于),但设置为 1 或 0,然后需要乘法?将 SLT 设置为 -1 或 0 不是更有用,这样我们就可以进行 AND 运算吗?
做时:
int foo(int a, int b, int x, int y)
{
return a < b ? x : y;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了使用 SLT 的穷人版本的无分支。我不确定我是否完全正确,通过使用位掩码作为 0 - 条件(0|1),我想出了:
branchless: …Run Code Online (Sandbox Code Playgroud) 我正在将我的应用程序从 IAB v1 升级到 IAB v5。
我可以成功连接计费客户端。
但如果我随后尝试查询产品详细信息,我会收到来自 BillingClient 的警告:
不支持查询商品详情。
查询代码是从文档中复制的:
QueryProductDetailsParams queryProductDetailsParams =
QueryProductDetailsParams.newBuilder()
.setProductList(
List.of(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("premium")
.setProductType(BillingClient.ProductType.INAPP)
.build()))
.build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
new ProductDetailsResponseListener() {
public void onProductDetailsResponse(BillingResult billingResult,
List<ProductDetails> productDetailsList) {
// check billingResult
// process returned productDetailsList
Log.d(TAG, "Got details for " + productDetailsList.size() + " products." );
}
}
);
Run Code Online (Sandbox Code Playgroud)
onProductDetailsResponseListener()调用该方法,但产品详细信息列表为空。
产品premiumID有效,已使用IAB v1库多次成功购买。
为什么我会收到此警告消息?为什么不支持查询详情?
我的 gradle 文件引入了 IAB v5:
dependencies {
...
api 'com.android.billingclient:billing:5.0.0'
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下 API 通过 …
因此,在 OpenGLES-2 中,片段着色器可以访问gl_PointCoord以查看片段在点基元上的位置。
还有gl_FragCoord可以查看片段在帧缓冲区中的位置。
但是,gl_LineCoord在哪里?它不存在,那么我的片段着色器如何知道线基元上片段的位置?
我想知道这一点的原因是我想做一条虚线,在屏幕空间而不是世界空间中使用虚线。
我目前能想到的唯一方法是采用 fragCoord.x^2 + fragCoord.y^2 的 sqrt 但如果只有 gl_LineCoord 可用,这听起来很昂贵且不必要。
我在我的 Ubuntu 主机上运行一个Android 虚拟设备。它使用的是 CPU/ABI Intel Atom (x86),而我使用的是主机 GPU。模拟器使用的是基于内核的虚拟机。
只要我使用 OpenGL ES2 上下文,这就会非常有效。但是,如果我的应用程序尝试创建 OpenGL ES3 上下文,则使用...
const EGLint contextAttribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 3,
EGL_NONE
};
context = eglCreateContext(display, config, NULL, contextAttribs);
Run Code Online (Sandbox Code Playgroud)
...然后我收到一个EGL_BAD_CONFIG错误:
I/biplane ( 2839): EGL: vendor Android version 1.4 Android META-EGL
I/biplane ( 2839): EGL: client apis OpenGL_ES
I/biplane ( 2839): number of EGL configurations that match our preferred criteria: 1
I/biplane ( 2839): R8 G8 B8 A8 DEPTH24
E/EGL_emulation( 2839): tid 2852: …Run Code Online (Sandbox Code Playgroud) android kvm android-virtual-device android-emulator opengl-es-3.0
我正在使用 perf 对程序的性能进行采样。
这对我有用:
$ perf record -g ./bench
...
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.023 MB perf.data (93 samples) ]
$ ls -al perf.data
-rw------- 1 bram bram 26848 Oct 25 10:22 perf.data
Run Code Online (Sandbox Code Playgroud)
但现在我想在程序中的特定点开始和停止收集。但如果我这样做:
$ perf record -g -e cycles --filter="start render_image" ./bench
--filter option should follow a -e tracepoint option
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为过滤器标志确实遵循 -e 选项。这里发生了什么?
我也对 perf.data 的体积如此之小感到困惑,难道它真的只收集了 93 个样本吗?它运行了几秒钟。
最后,我假设“-e Cycles”是默认事件?
更新:正如 Arnabjyoti Kalita 所解释的,有一类特殊的事件称为跟踪点。如果我以 root 身份运行 …
我正在使用AVX内在_mm256_extract_epi32().
我不完全确定我是否正确使用它,因为gcc不喜欢我的代码,而clang编译并运行它没有问题.
我是基于整数变量的值来提取通道,而不是使用常量.
使用clang3.8(或clang4)为avx2编译以下代码段时,它会生成代码并使用vpermd指令.
#include <stdlib.h>
#include <immintrin.h>
#include <stdint.h>
uint32_t foo( int a, __m256i vec )
{
uint32_t e = _mm256_extract_epi32( vec, a );
return e*e;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我改用gcc,那么就说gcc 7.2然后编译器无法生成代码,错误如下:
In file included from /opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/immintrin.h:41:0,
from <source>:2:
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/avxintrin.h: In function 'foo':
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/avxintrin.h:524:20: error: the last argument must be a 1-bit immediate
return (__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)__X, __N);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/immintrin.h:37:0,
from <source>:2:
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/smmintrin.h:449:11: error: selector must be an integer constant in the …Run Code Online (Sandbox Code Playgroud)