对于我的CUDA开发,我使用的是具有16个内核的机器,以及1个带有16个SM的GTX 580 GPU.对于我正在做的工作,我计划启动16个主机线程(每个核心1个),每个线程启动1个内核,每个线程包含1个块和1024个线程.我的目标是在16个SM上并行运行16个内核.这可能/可行吗?
我试图尽可能多地阅读关于独立上下文的内容,但似乎没有太多可用的信息.据我了解,每个主机线程都可以拥有自己的GPU上下文.但是,如果我使用独立的上下文,我不确定内核是否会并行运行.
我可以将所有16个主机线程中的所有数据读入一个巨型结构,并将其传递给GPU以启动一个内核.但是,复制太多会降低应用程序的速度.
在异步编程模型中编写代码的主要目的之一(更具体地说 - 使用回调而不是阻塞线程)是为了最小化系统中阻塞线程的数量.
对于运行线程,由于上下文切换和同步成本,这个目标是显而易见的.
但是被阻止的线程呢?为什么减少它们的数量如此重要?
例如,在等待来自Web服务器的响应时,线程被阻塞,并且不占用任何CPU时间,并且不参与任何上下文切换.
所以我的问题是:除了RAM(每个线程大约1MB?)阻塞线程占用了哪些其他资源?
另一个更主观的问题是:在什么情况下,这个成本真的证明了编写异步代码的麻烦(例如,价格可能是将你的好的连贯方法拆分为大量的beginXXX和EndXXX方法,并将参数和局部变量移动到类字段).
更新 - 我没有提及或没有给予足够重视的其他原因:
更多线程意味着更多地锁定公共资源
更多线程意味着更多创建和处理线程,这是昂贵的
系统肯定会耗尽线程/ RAM然后停止服务客户端(在Web服务器方案中,这实际上可以降低服务)
我正在调试一个使用的程序libnetfilter_queue.该文档指出用户空间队列处理应用程序需要CAP_NET_ADMIN能够运行.我使用该setcap实用程序完成了以下操作:
$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
Run Code Online (Sandbox Code Playgroud)
我已经验证了这些功能是否正确应用为a)程序正常工作,b)getcap返回以下输出:
$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用gdb(例如$ gdb ./a.out)命令行调试此程序时,由于没有设置正确的权限,它会失败.调试功能gdb完全正常工作,并按照正常情况进行调试.
我甚至试图将这些功能应用于gdb二进制本身无济于事.我这样做了(正如manpages所记载的那样," i"标志可能允许debugee从调试器继承该功能.
有什么微不足道的我遗失或者这真的不能做到吗?
在C程序中,您可以使用cap_set_procfrom 编辑功能libcap.如何在Perl程序中实现相同的功能?
如何将在子命名空间中创建的装载传播到父级?
我正在尝试创建一个利用overlayfs允许写入只读目录的工具.棘手的是,我希望任何用户都能够在没有root权限的情况下使用它.因此我希望这可以通过mount命名空间来实现,前提是管理员已经挂载了一个共享目录,然后任何用户都应该能够在该父树命名空间可见的树下创建一个覆盖(因此任何用户都可以登录) shell可以看到覆盖挂载).
这是我尝试过的,但不起作用:
# admin creates a shared tree for users to mount under
sudo mkdir /overlays
# bind mount over itself with MS_REC | MS_SHARED
sudo mount --bind --rshared /overlays /overlays
Run Code Online (Sandbox Code Playgroud)
假设用户想要创建覆盖/some/readonly/dir,他们应该创建/overlays/user/{upper,work,mnt}.我希望他们能够在/overlays使用以下代码传播的目录下安装叠加层.
// user_overlay.c
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <linux/capability.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int child(void *args)
{
pid_t p;
p = mount("overlay", "/overlays/user/mnt", "overlay", 0, "lowerdir=/some/readonly/dir,upperdir=/overlays/user/upper,workdir=/overlays/user/work");
if (p …Run Code Online (Sandbox Code Playgroud) 假设我们有一个数组int * data,每个线程将访问该数组的一个元素.由于此数组将在所有线程之间共享,因此它将保存在全局内存中.
让我们创建一个测试内核:
__global__ void test(int *data, int a, int b, int c){ ... }
Run Code Online (Sandbox Code Playgroud)
我确定data数组将在全局内存中,因为我使用了为这个数组分配了内存cudaMalloc.至于其他变量,我已经看到一些传递整数而不分配内存的例子,立即到内核函数.在我的情况下,这些变量是a b和c.
如果我没有记错的话,即使我们不直接调用cudaMalloc分配4个字节为每三个整数,CUDA会自动为我们做,所以最后的变数a b和c将在全球内存中分配.
现在这些变量只是辅助的,线程只读取它们而没有别的.
我的问题是,将这些变量传输到共享内存不是更好吗?
我想如果我们有例如10带有1024线程的块,我们需要10*3 = 30读取4字节以便将数字存储在每个块的共享内存中.
如果没有共享内存,并且每个线程必须读取所有这三个变量一次,那么全局内存读取的总量将1024*10*3 = 30720是非常低效的.
现在,这里的问题是,我有点新的CUDA和我不知道是否有可能转移内存变量a b和c每个块的共享内存,而不必每个线程从全局存储器读取这些变量并加载它们到共享内存,所以最终全局内存读取的总量将是1024*10*3 = 30720和否10*3 = 30.
在以下网站上有这个例子:
__global__ void staticReverse(int *d, int n)
{
__shared__ …Run Code Online (Sandbox Code Playgroud) 在我的自定义环境拦截库预装它运行一个特殊的实施bind(),connect()等电话.
我看到的问题是,无论何时使用命令显式启用应用程序setcap,执行应用程序都无法预加载拦截器库并调用默认的libc connect().
这是预期的行为吗?如果是,可能是什么原因禁用LD_PRELOAD?
是否有任何调整或方法可用于成功预加载启用功能的库.
所以我正在尝试编写一个将RGB图像转换为灰度的程序.我从Udacity问题集中得到了这个想法.问题是,当我在Udacity Web环境中写出内核时,它说我的代码有效,但是,当我尝试在我的计算机上本地执行时,我没有错误,但是我的图像而不是出现灰度,来了完全是灰色的.它看起来像一个灰色框,是我加载的图像的尺寸.你能帮我找到我的代码中的错误,我把它与Udacity版本进行了比较,我似乎无法找到它.
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <string>
#include <cuda.h>
#include <stdio.h>
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>
#define CUDA_ERROR_CHECK
#define CudaSafeCall( err ) __cudaSafeCall( err, __FILE__, __LINE__ )
#define CudaCheckError() __cudaCheckError( __FILE__, __LINE__ )
inline void __cudaSafeCall(cudaError err, const char *file, const int line)
{
#ifdef CUDA_ERROR_CHECK
if (cudaSuccess != err)
{
fprintf(stderr, "cudaSafeCall() failed at %s:%i : %s\n",
file, line, cudaGetErrorString(err));
exit(-1);
}
#endif
return;
}
inline void __cudaCheckError(const char *file, const int line)
{
#ifdef CUDA_ERROR_CHECK
cudaError …Run Code Online (Sandbox Code Playgroud) 容器实际启动后是否可以添加功能(例如:NET_ADMIN)?
我几天前启动了一个容器,并且由其提供的服务正被其他几个在其他服务器上远程运行的进程使用.我需要为它添加一个loopback接口,但不幸的是,我忘了启动容器,--cap-add=NET_ADMIN因此现在无法添加接口.
我正在寻找一个选项,如果有可能以某种方式将此功能提供给此容器.
我正在努力限制现有复杂应用程序的功能,并且我一直在寻找可靠的来源一段时间,证明其中包含的权限cap_dac_override是cap_dac_read_search.
事实确实如此,这似乎是合乎逻辑的,如下所示capabilities(7):
CAP_DAC_OVERRIDE
* 绕过文件读取、写入和执行权限检查。CAP_DAC_READ_SEARCH
* 绕过文件读取权限检查和目录读取和执行权限检查;
* 调用 open_by_handle_at(2);
* 使用 linkat(2) AT_EMPTY_PATH 标志创建到文件描述符引用的文件的链接。
另外,我对能力检查跟踪器的实验证实这cap_dac_override应该足够了。似乎在每次执行读访问cap_dac_read_search之前都会进行检查。cap_dac_override
我还在grsecurity 论坛上找到了以下帖子,不幸的是,该帖子仅涉及/proc:
在这种情况下,上游内核的工作方式是首先检查 CAP_DAC_OVERRIDE,然后检查 CAP_DAC_READ_SEARCH。
cap_dac_read_search我仍然不确定如果我想授予我的应用程序对整个文件系统的完整读取访问权限,省略是否完全安全。我完全知道cap_dac_override另外授予写入权限,并且我想要这样。
是否有可能在内核中的某个地方只检查 forcap_dac_read_search而不检查 for cap_dac_override?
为了安全起见,我应该包含这两种功能还是cap_dac_read_search在这种情况下完全多余?
linux ×4
cuda ×3
c ×2
linux-kernel ×2
.net ×1
asynchronous ×1
c# ×1
c++ ×1
containers ×1
cuda-streams ×1
docker ×1
filesystems ×1
gdb ×1
opencv ×1
perl ×1
permissions ×1
sniffing ×1