我做了一个宏来简化 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)
是否可以使这个宏与多个模板参数一起工作?
我正在尝试开发一个驱动程序来与设备进行通信。我的驱动程序使用 sysfs 与用户空间通信,并使用 rs232 从外部设备发送/接收信息。我的 Boad 和其他设备通过 rs232 进行通信,但我不知道如何在驱动程序中使用我的 rx、tx、cts/rts 初始化此通信。我看到很多关于 tty 的信息。但没有直接使用 GPIO 进行 rs232 通信。
结构
用户 -> 板
|-----rx------|
|-----tx------|
|-----cts-----|
设备
如果有人有想法:)
谢谢
在 linux 内核中有一个struct XX包含struct list_head YY.
现在给出一个指向struct XX对象的指针,我想XX在链表中找到所有结构。所以我会遍历list_head结构体,然后找到对应的父结构体。
但是这里的第二步似乎不适用。所以我不确定是否有可能实现这一目标。
例子:
struct XX {
...
struct list_head YY;
};
Run Code Online (Sandbox Code Playgroud) 我使用 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) 我正在使用 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而不是浮点数。
我正在开发 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)
谁能帮我解决这个问题?
谢谢你。
我目前正在开发一个班级项目,其中包括基于内核的信号量实现。而不是使用 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) 我的集群节点主要绑定到 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
我对虚拟化非常陌生,最近我一直在努力熟悉 VMM 的运行方式以及如何进行超级调用。
谈到我计划在安装在我的 Ubuntu 桌面上的 KVM 中实现一个新的超级调用,然后可以从来宾环境调用。通过这个超级调用,我计划只返回一个字符串,说“Hello World”。在这一点上,我对如何实现它一无所知。如果您能指导我如何实现这样的超级调用,那将非常有帮助。谢谢!
粗略地说,我试图从内核空间发出 IOCTL 调用,而不去用户空间。(我在 SO 中找到的所有答案都建议通过用户空间)。
具体来说,我尝试/dev/random从内核空间(使用内核模块)填充熵池 ( ) [我知道这样做的危险;)]。从用户空间填充熵池是使用 IOCTL 完成的,例如rngaddentropy。有没有办法从内核空间做同样的事情?
kernel ×10
linux ×4
c ×2
linux-kernel ×2
python ×2
bandwidth ×1
c++ ×1
cuda ×1
definition ×1
driver ×1
export ×1
gpio ×1
hypervisor ×1
ioctl ×1
kvm ×1
laplacian ×1
linked-list ×1
macros ×1
netfilter ×1
random ×1
scipy ×1
serial-port ×1
struct ×1
symbols ×1
system-calls ×1
templates ×1
ubuntu-14.04 ×1