小编éta*_*ogy的帖子

NumPy/SciPy中的多线程整数矩阵乘法

做点什么

import numpy as np
a = np.random.rand(10**4, 10**4)
b = np.dot(a, a)
Run Code Online (Sandbox Code Playgroud)

使用多个核心,运行良好.

a但是,中的元素是64位浮点数(或32位平台中的32位?),我想将8位整数数组相乘.但尝试以下方法:

a = np.random.randint(2, size=(n, n)).astype(np.int8)
Run Code Online (Sandbox Code Playgroud)

导致dot产品不使用多个内核,因此在我的PC上运行速度慢约1000倍.

array: np.random.randint(2, size=shape).astype(dtype)

dtype    shape          %time (average)

float32 (2000, 2000)    62.5 ms
float32 (3000, 3000)    219 ms
float32 (4000, 4000)    328 ms
float32 (10000, 10000)  4.09 s

int8    (2000, 2000)    13 seconds
int8    (3000, 3000)    3min 26s
int8    (4000, 4000)    12min 20s
int8    (10000, 10000)  It didn't finish in 6 hours

float16 (2000, 2000)    2min 25s
float16 (3000, …
Run Code Online (Sandbox Code Playgroud)

python multithreading numpy blas matrix-multiplication

22
推荐指数
1
解决办法
3468
查看次数

如果“纯 XCB”OpenGL 是不可能的,那么 xcb/glx.h 中的 XCB/GLX API 有什么用?

XCB 官方文档告诉我们,将 OpenGL 与 XCB 一起使用是不可能的:还必须使用 Xlib。

Bart Massey(XCB 的创建者)的这篇文章并不表明这应该是不可能的。但我确定我错过了一些东西。

我花了几个小时浏览xcb/glx.h这里组织得很好。在我看来,它就像一个成熟的 API。但我无法让它工作。

问题

  1. XCB/GLX API 没用吗?的目的是xcb/glx.h什么?
  2. 如何使用 API?

(注意。这是了解 XCB 工作原理的持续努力的一部分。)

相关的SO 线程


次要的、冗长的东西

如果有人愿意尝试一下,这里是 XCB 邮件列表中原始帖子的来源,将其精简并放入单个文件中。

你会注意到xcb_glx_make_context_current返回错误169(不知道是什么意思),但只有在 xcb_glx_create_window需要0NULL它的最后两个参数。这些参数涉及一组属性,似乎是由函数返回的xcb_glx_create_window_attribs,但我不知道如何使用它...

之前的长辅助函数int main()仅意味着两个返回两个整数,xcb_glx_fbconfig_t fbconfig xcb_visualid_t glx_visual,对应于第一个“匹配”帧缓冲区配置。在我的平台上,这些是0xa70x24。它们正是 Xlib/GLX 例程(实际有效)返回的内容,所以我知道我选择的帧缓冲区配置很好。

所以,问题似乎发生在xcb_glx_create_windowxcb_glx_make_context_current......

// gcc main2.c -o main …
Run Code Online (Sandbox Code Playgroud)

linux x11 framebuffer glx xcb

8
推荐指数
1
解决办法
2282
查看次数

为什么 Python 的请求比 C 的 libcurl 快 10 倍?

对于 1.6 MB 的请求(需要800 毫秒,而/有时需要多达7 秒),Python 的requests库似乎比 C 的库libcurl(C API、CLI 应用程序和 Python API)快 10 倍。requestscurllibcurl

  • 为什么是这样?

  • 我怎样才能curl在 C 中运行得像requests在 Python 中一样快?

libcurl似乎以 16KB 块的形式得到答复,而请求似乎一下子就得到了整个事情,但我不确定是不是这样......我试过了,curl_easy_setopt(curl_get, CURLOPT_BUFFERSIZE, 1<<19)但让缓冲区大小变小似乎只有好处。

我试着看源代码requests,而且我觉得它使用urllib3作为它的HTTP“后端” ......但使用urllib3直接在相同的(失望)导致的结果使用curl

这里有些例子。

/*
gcc-8 test.c -o test -lcurl  &&  t ./test
*/
#include <curl/curl.h>

int main(){
  CURLcode curl_st;
  curl_global_init(CURL_GLOBAL_ALL);

  CURL* curl_get …
Run Code Online (Sandbox Code Playgroud)

c python https curl libcurl

8
推荐指数
1
解决办法
1166
查看次数

OpenGL是否使用Xlib来绘制窗口并渲染事物,还是反过来?

我想使用OpenGLXlib在窗口上渲染字体和线条,但我想知道哪一个是"更基础".

使用Xlib接口,我可以用这样的东西(我在这里找到)来渲染这样的东西:

// gcc x_1.c -o x_1 -lX11 && ./x_1

#include <stdio.h>
#include <X11/Xlib.h>

// This program draws a red line and some text in a chosen font.
Display *display;
Window  window;
XSetWindowAttributes attributes;
XGCValues gr_values;
XFontStruct *fontinfo;
GC gr_context;
Visual *visual;
int depth;
int screen;
XEvent event;
XColor    color, dummy;

int main() {
     display = XOpenDisplay(NULL);
     screen = DefaultScreen(display);
     visual = DefaultVisual(display,screen);
     depth  = DefaultDepth(display,screen);
     attributes.background_pixel = XWhitePixel(display,screen);

     window = XCreateWindow( display,XRootWindow(display,screen),
                            200, …
Run Code Online (Sandbox Code Playgroud)

x11 opengl graphics fonts

5
推荐指数
2
解决办法
2696
查看次数

复制 5 色 CSS 渐变

我正在尝试在 CSS 中复制以下渐变:

在此输入图像描述

我能做到的最好的事情是:

background:
  radial-gradient(ellipse at 20% 20%, #35234b 0%, transparent 70%),
  radial-gradient(ellipse at 60% 20%, #2975bf 0%, transparent 70%),
  radial-gradient(ellipse at 100% 20%, #3d54b1 0%, transparent 70%),
  radial-gradient(ellipse at 100% 100%, #9f3c54 0%, transparent 70%),
  radial-gradient(ellipse at 20% 100%, #362d6f 0%, transparent 70%);
background-blend-mode:screen;
Run Code Online (Sandbox Code Playgroud)

这不是那么接近:

在此输入图像描述

是否有可能更接近图像中的渐变?(不一定是 CSS,Javascript 也有效,甚至是外部库。但首选纯 CSS。)

background:
  radial-gradient(ellipse at 20% 20%, #35234b 0%, transparent 70%),
  radial-gradient(ellipse at 60% 20%, #2975bf 0%, transparent 70%),
  radial-gradient(ellipse at 100% 20%, #3d54b1 0%, transparent 70%),
  radial-gradient(ellipse at 100% 100%, …
Run Code Online (Sandbox Code Playgroud)

css gradient colors linear-gradients background-color

5
推荐指数
1
解决办法
1801
查看次数

如何"注册"我的库libfoo.so以将其与`-lfoo`链接?

  1. 如何"注册"我的库foo.c,编译到libfoo.so,链接它-lfoo?是通过追加它的路径LD_LIBRARY_PATH?是跑步sudo ldconfig吗?

  2. 为了好奇,我该把它"注册"给谁?也就是说,哪个应用程序"需要知道"是什么-lfoo意思才能gcc bar.c -lfoo工作?这是bash环境吗?是gcc吗?是内核吗?

  3. 静态库(例如libfoo.a)是否有任何不同之处?

c linux bash gcc dynamic-linking

4
推荐指数
1
解决办法
573
查看次数

在C中使用内联汇编进行位奇偶校验?

我正在尝试计算大量uint64的位奇偶校验.比特奇偶校验是指接受uint64的函数,如果设置的比特数是偶数则输出0,否则为1.

目前我正在使用以下功能(@Troyseph,在这里找到):

uint parity64(uint64 n){
  n ^= n >> 1;
  n ^= n >> 2;
  n = (n & 0x1111111111111111) * 0x1111111111111111;
  return (n >> 60) & 1;
}
Run Code Online (Sandbox Code Playgroud)

相同的SO页面具有以下汇编例程(由@papadp提供):

.code

; bool CheckParity(size_t Result)
    CheckParity PROC
    mov     rax, 0
    add     rcx, 0
    jnp     jmp_over
    mov     rax, 1
jmp_over:
    ret
CheckParity ENDP

END
Run Code Online (Sandbox Code Playgroud)

它利用了机器的奇偶校验标志.但我不能让它与我的C程序一起工作(我知道旁边没有汇编).

问题.如何在C源文件中包含上面(或类似)代码作为内联汇编,以便该parity64()函数运行该代码?

(我在Intel Xeon Haswell上使用GCC和64位Ubuntu 14)


如果它有任何帮助,则parity64()在以下例程中调用该函数:

uint bindot(uint64* a, uint64* b, uint64 entries){
    uint parity …
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64 inline-assembly

4
推荐指数
3
解决办法
576
查看次数

如何在C中"实现"数组?

一个阵列是特别一个指针.可以肯定的是,两个左值似乎都包含(1维)虚拟内存中某个位置的(1维)坐标.但请考虑这个例子.

#include <stdlib.h>
#include <stdio.h>
int main(){
  char buffer0[4096];
  char* buffer1 = malloc(4096);
  printf("lvalue %16p  sizeof %lu\n", (void *) buffer0, sizeof(buffer0));
  printf("lvalue %16p  sizeof %lu\n", (void *) buffer1, sizeof(buffer1));
// Example output:  lvalue   0x7ffcb70e8620  sizeof 4096
// Example output:  lvalue         0x7a4420  sizeof 8
}
Run Code Online (Sandbox Code Playgroud)

想到的实际差异是:

  1. 数组知道它们有多大(以字节为单位)(并且,通过扩展,它们知道它们有多少元素); 指针不会(但malloc() 必须知道指针有多大,知道free()只给指针多少......!)
  2. 数组是"垃圾收集"(不需要free()它们); 指针必须手动释放(如果它们拥有非常重要的内存量,即通过malloc())
  3. 阵列"活"在堆栈中(高虚拟内存地址,至少在我的平台上); 指针在堆中"活"(低虚拟内存地址)
  4. 传递给函数时,数组会衰减为指针
  5. 数组无法调整大小; 指针可以

总的来说,数组似乎比指针更聪明(但功能更少)(他们知道它们有多大,它们有多少元素,并且它们具有自动内存管理).


问题

  1. 数组如何"知道"它们有多大?这是如何实现的?
  2. 一般来说,如何用C语言实现数组?(编译器是这样做的,还是内核?

c arrays gcc pointers

3
推荐指数
3
解决办法
549
查看次数

将2D数组插入(更大)2D数组的最快方法

说有两个2D阵列,ab

import numpy as np
a = np.random.rand(3, 4)
b = np.random.zeros(8, 8)
Run Code Online (Sandbox Code Playgroud)

并且b总是大于a两个轴上的。

(编辑:b初始化为零数组,以反映所有未被其占用的元素a都将保持零的事实。)

问题。什么是最快最Python化到“插入”的方式a进入b

到目前为止,我已经尝试了2件事:

  1. 使用np.pad于“转” a入形状的阵列(8, 8)
  2. 循环遍历每行a并将其放置在其中的相应行中b

没有尝试过使用双重嵌套循环来遍历的每个元素a,因为我认为这样做对性能不友好。

动机。每个数组a都是一个很小的字符,我想将每个字符馈入一个神经网络,该神经网络接受shape的扁平数组(8, 8)。形状数组(64,)。(我我不能简单地展平a到一个维度并用零填充它,因为它的二维结构会变形,所以,我必须先将其“重塑”为(8, 8),对吗?)有数百万个字符。

python numpy

1
推荐指数
1
解决办法
1462
查看次数

具有两个"同步"变量的类的最短示例

我正在尝试实现一个代表(几何)圆的类的最简单的例子,并且可以打印自己的数据.

Circle是一个有两个变量的类,self.radiusself.area.唯一的要求是,当更改一个变量时,另一个变量也会发生变化.

最简单的方法是什么?是property装饰品吗?

这是我的尝试.

import math


class Circle:

    def __init__(self, radius=1):
        self._radius = radius
        self._area = math.pi * radius**2

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        self._radius = radius
        self._area = math.pi * radius**2

    @property
    def area(self):
        return self._area

    @area.setter
    def area(self, area):
        self._area = area
        self._radius = math.sqrt(area / math.pi)

    def __repr__(self):
        return 'radius {:.2f}  area {:.2f}'.format(self._radius, self._area)


c = Circle()
print(c)

c.radius = 110
print(c)

c.area = 3
print(c) …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

1
推荐指数
1
解决办法
46
查看次数

为什么`ioctl(fd,EVIOCGRAB,1)`有时会导致密钥垃圾邮件?

我正在尝试编写自己的"键盘驱动程序"(没有实际编写内核模块),通过抓取键盘,我认为是用户空间中最低级别的抽象:/dev/input/event*.

下面的代码执行霎那,只要你改变的第一ocurrence ioctl(fd, EVIOCGRAB, UNGRAB)ioctl(fd, EVIOCGRAB, GRAB).

// gcc main.c -o main

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <linux/input.h>
#include <fcntl.h>
#include <errno.h>

#define EXIT_KEY  KEY_ESC
#define UNGRAB    0
#define GRAB      1

const char* kbd_device = "/dev/input/event4";

// ------------------------------------------------------------------------------------------------
int main(void){
  int fd = open(kbd_device, O_RDONLY);
  if(fd == -1){
    printf("Cannot open %s. %s.\n", kbd_device, strerror(errno));
    return -1;
  }

  if(ioctl(fd, EVIOCGRAB, UNGRAB))
    printf("Couldn't grab %s. %s.\n", kbd_device, strerror(errno));
  else
    printf("Grabbed %s!\n", kbd_device);

  while(1){
    struct input_event …
Run Code Online (Sandbox Code Playgroud)

c linux keyboard ubuntu-14.04

1
推荐指数
1
解决办法
880
查看次数

多个线程可以对数组中的不同字节进行“原子”无锁写入吗?

N线程是否可以kx-bit 元素的数组中M xN最多M)对-bit 元素的长度不重叠的间隔进行“原子”无锁写入?

例如。假设N10M10k是 1 并且x8

然后我们有10线程,一个10字节数组,每个线程将1字节写入数组。(每个线程写入不同的字节,因为根据假设,间隔是不重叠的。)


这是一个测试这是否可能的程序,或者一个线程是否“踩到邻居的脚趾”。

/*
t gcc-8  bytes1.c -o bytes1  -lpthread  &&  t ./bytes1
*/
#include <stdint.h>
typedef  uint8_t   u8;
typedef  int32_t  i32;
typedef  int64_t  i64;

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

// ----------------------------------------------------------------------------------------------------------------------------#
/* @blk1  test if multiple threads …
Run Code Online (Sandbox Code Playgroud)

c linux parallel-processing multithreading pthreads

1
推荐指数
1
解决办法
50
查看次数