我想知道在C/C++中执行cuda内核调用的开销是多少,如下所示:
somekernel1<<<blocks,threads>>>(args);
somekernel2<<<blocks,threads>>>(args);
somekernel3<<<blocks,threads>>>(args);
Run Code Online (Sandbox Code Playgroud)
我之所以这么说是因为我正在构建的应用程序重复调用几个内核(没有内存在调用之间重新读/写到设备)而且我想知道是否将这些内核调用包装到单个内核中调用(somekernel1-3成为设备功能)会在性能上产生任何有意义的差异.
我的问题是我有一个在recv()调用中的线程.远程主机突然终止(没有close()套接字调用)并且recv()调用继续阻塞.这显然不是很好,因为当我加入线程来关闭进程(本地)时,这个线程将永远不会退出,因为它正在等待永远不会来的recv.
所以我的问题是人们通常认为什么方法是处理这个问题的最佳方法?在回答之前还应该知道一些额外的注意事项:
在退出之前,我无法确保远程主机关闭套接字.
此解决方案无法使用外部库(例如boost).它必须使用C++/C的标准库/功能(最好不是特定于C++ 0x).
我知道这可能在过去曾被问过,但是我想知道如何正确地解决这个问题(没有做过去我本来会做的超级hacky).
谢谢!
我想知道CUDA应用程序的warp调度顺序是否是确定性的.
具体来说,我想知道在相同设备上具有相同输入数据的同一内核的多次运行时,warp执行的顺序是否保持不变.如果没有,是否有任何可能强制执行warp执行的命令(例如在调试依赖于顺序的算法时)?
我想知道是否有可能在ARM平台上更改正在运行的应用程序执行的字节顺序.正如你们中的一些人所知,ARM是双端的(支持大和小)我想知道是否可以在Android(或一般的Linux)上设置单个应用程序在执行时使用不同的字节顺序或者是否可以在执行中更改处理器字节顺序.
要阻止一些可能的回应.改变字节顺序(如果可能在应用程序级别上)几乎肯定是一个坏主意,但我正在为ARM平台构建工具,我想知道我使用set工具的应用程序是否可能会这样做.即使这样做可能会对其他应用程序/操作系统造成灾难性后果,我想知道它是否可以由应用程序完成.
到目前为止,我对ARM的看法似乎只有OS可以在这方面设置处理器的模式.但是我还没有就这个问题找到明确的答案.提前致谢!
我的问题是在开始执行内核后,在CUDA(特别是开普勒或较新的nvidia体系结构)中调度线程块。
根据我对开普勒架构的理解(可能不正确),可以随时将单个SM调度的活动块的数量受到限制(如果我没记错的话,可以分配16个块)。同样,据我了解,一旦将块计划在特定的SM上运行,它们就无法移动。
我很好奇的是,在最初选择块并开始在设备上执行之后,块调度和执行行为(假设内核具有的线程块多于所有SM中的活动块)。
SM中当前运行的单个活动块完成后是否立即执行新块?还是仅在SM完成其所有当前活动块后才执行下一组块?还是仅在所有SM完成所有当前活动的块执行后才启动它们?
另外,我听说块调度已“固定”到单个SM。我假设仅在块变为活动状态后才将其固定为单个SM。是这样吗