标签: kernel

带有模板的 CUDA 内核启动宏

我做了一个宏来简化 CUDA 内核调用:

#define LAUNCH LAUNCH_ASYNC

#define LAUNCH_ASYNC(kernel_name, gridsize, blocksize, ...) \
    LOG("Async kernel launch: " #kernel_name);              \
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__);

#define LAUNCH_SYNC(kernel_name, gridsize, blocksize, ...)     \
    LOG("Sync kernel launch: " #kernel_name);                  \
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__); \
    cudaDeviceSynchronize();                                   \
    // error check, etc...
Run Code Online (Sandbox Code Playgroud)

用法:

LAUNCH(my_kernel, 32, 32, param1, param2)

LAUNCH(my_kernel<int>, 32, 32, param1, param2)
Run Code Online (Sandbox Code Playgroud)

这很好用;通过第一个定义,我可以启用同步调用和错误检查以进行调试。

但是它不适用于多个模板参数,如下所示:

LAUNCH(my_kernel<int,float>, 32, 32, param1, param3)
Run Code Online (Sandbox Code Playgroud)

我在调用宏的行中收到的错误消息:

error : expected a ">"
Run Code Online (Sandbox Code Playgroud)

是否可以使这个宏与多个模板参数一起工作?

c++ macros templates kernel cuda

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

带有 GPIO 的串行 Linux 嵌入式驱动程序

我正在尝试开发一个驱动程序来与设备进行通信。我的驱动程序使用 sysfs 与用户空间通信,并使用 rs232 从外部设备发送/接收信息。我的 Boad 和其他设备通过 rs232 进行通信,但我不知道如何在驱动程序中使用我的 rx、tx、cts/rts 初始化此通信。我看到很多关于 tty 的信息。但没有直接使用 GPIO 进行 rs232 通信。

结构

用户 -> 板

|-----rx------|
|-----tx------|
|-----cts-----|

设备

如果有人有想法:)

谢谢

kernel serial-port driver gpio

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

检索 list_head 对象的父结构

在 linux 内核中有一个struct XX包含struct list_head YY.

现在给出一个指向struct XX对象的指针,我想XX在链表中找到所有结构。所以我会遍历list_head结构体,然后找到对应的父结构体。

但是这里的第二步似乎不适用。所以我不确定是否有可能实现这一目标。

例子:

struct XX {
    ...
    struct list_head YY;
};
Run Code Online (Sandbox Code Playgroud)

c linux struct kernel linked-list

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

不同核的拉普拉斯算子

我使用 python 代码找到一个图像的拉普拉斯算子,只有一个通用内核 = 1(使用 cv2)。现在我想使用一个新内核,array([0,-1,0][-1,5,-1][0,-1,0])但不确定如何使用我拥有的代码来实现它,或者如何编写调用内核的新代码。

ksize = 1
scale = 1
delta = 0
ddepth = cv2.CV_64F

img = cv2.imread('/Users//Desktop/Programming/image.tif')
img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray_lap = cv2.Laplacian(gray,ddepth,ksize = ksize,scale = scale,delta = delta)
dst = cv2.convertScaleAbs(gray_lap)

plt.imshow(dst, cmap = 'gray')
Run Code Online (Sandbox Code Playgroud)

python kernel laplacian

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

获取 SciPy 的 gaussian_kde 函数使用的带宽

我正在使用 SciPy 的stats.gaussian_kde函数从一组x,y点数据生成内核密度估计 (kde) 函数。

这是我的代码的简单 MWE:

import numpy as np
from scipy import stats

def random_data(N):
    # Generate some random data.
    return np.random.uniform(0., 10., N)

# Data lists.
x_data = random_data(100)
y_data = random_data(100)

# Obtain the gaussian kernel.
kernel = stats.gaussian_kde(np.vstack([x_data, y_data]))
Run Code Online (Sandbox Code Playgroud)

由于我没有手动设置带宽(通过bw_method键),该功能默认使用 Scott 规则(请参阅功能说明)。我需要的是获取stats.gaussian_kde函数自动设置的这个带宽值。

我试过使用:

print kernel.set_bandwidth()
Run Code Online (Sandbox Code Playgroud)

但它总是返回None而不是浮点数。

python kernel bandwidth scipy

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

Linux 内核 - 数据定义没有类型或存储类

我正在开发 Linux Kernel 3.4,我有以下代码:

    /* Proximity sensor calibration values */
unsigned int als_kadc;
EXPORT_SYMBOL(als_kadc);
static int __init parse_tag_als_calibration(const struct tag *tag)
{
    als_kadc = tag->u.als_kadc.kadc;

    return 0;
}

__tagtable(ATAG_ALS, parse_tag_als_calibration);
Run Code Online (Sandbox Code Playgroud)

但是当我构建它时,它给了我以下错误:

warning: data definition has no type or storage class [enabled by default]
Run Code Online (Sandbox Code Playgroud)

是的,这是一个警告,但它是一个被禁止的警告,它被视为一个错误。警告指向代码中的以下行:

EXPORT_SYMBOL(als_kadc);
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题?

谢谢你。

linux kernel symbols export definition

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

DEFINE_SPINLOCK(...) spinlock_t 参数错误

我目前正在开发一个班级项目,其中包括基于内核的信号量实现。而不是使用 DEFINE_SPINLOCK(sem_lock); 作为 /kernel/sys.c 中的全局变量,我创建了一个方案,其中信号量结构保存 spinlock_t 变量(在用户空间中屏蔽为 void *),以便允许不同的信号量有机会 down()/up( )独立(这应该转化为更高效的代码,更少的繁忙等待)。我进行系统调用来初始化信号量,并将指针传递给结构。但是,在初始化信号量的 spinlock_t 时,我遇到了一行错误。

我联系了我的教授,他说出于本次作业的目的,只是使用具有全局自旋锁定义的粗略实现。然而,很难放手这一点。虽然我显然不介意走这条路,但我仍然想了解为什么我的实现不起作用。谁能帮我这个?

这是错误:

    CC      kernel/sys.o
kernel/sys.c: In function 'sys_cs1550_sem_init':
kernel/sys.c:2491: error: expected '=', ',', ';', 'asm' or '__attribute__' before '->' token
kernel/sys.c:2491: error: expected expression before '->' token
make[1]: *** [kernel/sys.o] Error 1
make: *** [kernel] Error 2
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

DEFINE_SPINLOCK(sem->sem_lock);  
DEFINE_SPINLOCK(&(sem->sem_lock));  
DEFINE_SPINLOCK((&(sem->sem_lock)));  
DEFINE_SPINLOCK(*(sem->sem_lock));  
spinlock_t *lock = &(sem->sem_lock);  
DEFINE_SPINLOCK(lock);
Run Code Online (Sandbox Code Playgroud)

我在 /kernel/sys.c 中的信号量结构代码:

/*
* Initialize a semaphore with the creation of it's spinlock.
* The idea is to avoid …
Run Code Online (Sandbox Code Playgroud)

c linux kernel system-calls linux-kernel

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

如何使bond0/eth0接口UP

我的集群节点主要绑定到 eth0 和 bond0 接口:

[root@machine]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether 00:25:90:68:79:4a brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 00:25:90:68:79:4b brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 00:25:90:68:79:4a brd ff:ff:ff:ff:ff:ff
8: gre0: <NOARP> mtu 1476 qdisc noop state DOWN 
    link/gre 0.0.0.0 brd 0.0.0.0
9: …
Run Code Online (Sandbox Code Playgroud)

linux kernel network-programming netfilter linux-device-driver

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

在 kvm 中实现自定义超级调用

我对虚拟化非常陌生,最近我一直在努力熟悉 VMM 的运行方式以及如何进行超级调用。

谈到我计划在安装在我的 Ubuntu 桌面上的 KVM 中实现一个新的超级调用,然后可以从来宾环境调用。通过这个超级调用,我计划只返回一个字符串,说“Hello World”。在这一点上,我对如何实现它一无所知。如果您能指导我如何实现这样的超级调用,那将非常有帮助。谢谢!

virtualization kernel kvm hypervisor ubuntu-14.04

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

来自内核空间的 IOCTL

粗略地说,我试图从内核空间发出 IOCTL 调用,而不去用户空间。(我在 SO 中找到的所有答案都建议通过用户空间)。

具体来说,我尝试/dev/random从内核空间(使用内核模块)填充熵池 ( ) [我知道这样做的危险;)]。从用户空间填充熵池是使用 IOCTL 完成的,例如rngaddentropy。有没有办法从内核空间做同样的事情?

random kernel ioctl kernel-module linux-kernel

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