我开始写一些 CUDA 代码,我想对std::swap()内核中的两个变量做等价的;它们在寄存器文件中(没有溢出,不在某些缓冲区中,等等)。假设我有以下设备代码:
__device__ foo(/* some args here */) {
/* etc. */
int x = /* value v1 */;
int y = /* value v2 */;
/* etc. */
swap(x,y);
/* etc. */
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以写
template <typename T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道 - 不是有一些内置的 CUDA 用于此功能吗?
笔记:
我是Cuda的新手,我有以下功能:
__global__ void square(float *myArrayGPU)
{
myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)
我想使用cuda数学库,我试过,#include "math.h"但我仍然得到错误
error: calling a __host__ function("__sqrt") from a __global__ function("square") is not allowed
知道我应该包含哪些库来使用sqrt?
为什么/何时使用更好mmap(),而不是fread()从块中的文件流转换为字节数组?
uint8_t my_buffer[MY_BUFFER_SIZE];
size_t bytes_read;
bytes_read = fread(my_buffer, 1, sizeof(my_buffer), input_file);
if (MY_BUFFER_SIZE != bytes_read) {
fprintf(stderr, "File read failed: %s\n", filepath);
exit(1);
}
Run Code Online (Sandbox Code Playgroud) 我有一个 CUDA 流,有人递给我 - 一个cudaStream_t值。CUDA运行时 API似乎没有指示我如何获取与该流关联的设备的索引。
现在,我知道这cudaStream_t只是一个指向驱动程序级流结构的指针,但我不太愿意深入研究驱动程序。有一个惯用的方法来做到这一点吗?或者有什么好的理由不想这样做?
编辑:这个问题的另一个方面是流是否确实与设备相关联,在这种方式中,CUDA 驱动程序本身可以根据给定的指向结构确定设备的标识。
在非 Doxygen 的评论中,我经常有:
/* Lorem ipsum etc.
*
* Notes:
* - A first note.
* - Some other note note.
*/
Run Code Online (Sandbox Code Playgroud)
但是对于 Doxygen,我有@note(或\note),没有@notes)。那么,我应该使用多个@notes,还是将所有注释都放在同一个 s 下@note?
我有一个 CMake 项目,同时构建了一个静态库并将其与其他代码链接到一个可执行文件中。由于我不会讨论的原因,我希望此链接与--whole-archive链接器标志一起发生。
现在,这个标志很棘手,因为你不能把它添加到任何地方——你必须切换它,然后列出你想要它应用的库,然后取消它。
我在某处读过(URL 使我无法理解),如果您有一个预先存在的库,您可以通过执行以下操作有效地添加此链接器标志:
# Just an example, find_library calls should really be isolated to separate find modules
find_library(FOO_LIBRARY foo)
set(FOO_LIBRARY "-Wl,--whole-archive ${FOO_LIBRARY} -Wl,--no-whole-archive")
add_executable(hello main.c)
target_link_libraries(hello ${FOO_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
没关系。但是,如果它是您正在构建的静态库,而您没有预先存在的变量(即您有add_library()CMake 命令的变量),该怎么办?您是否必须手动指示其路径而不是 ${FOO_LIBRARY}?或者是否有其他一些技巧可以用来获取 CMake 在命令行中放置的路径?
此外,如果我要使用某种类似${FOO_LIBRARY}字符串而不是我的静态库目标标识符 - 我相信 CMake 可能会错过依赖项,即它可能不会与修改后的库重新链接(甚至不会构建它),因为 target_link_libraries命令将看到一个奇怪的字符串,而不是另一个目标的标识符。
C ++核心准则提到跨度,而不是“跨度”。但是-我看到Microsoft的GSL实现中有一个multi_span类
template <
typename ValueType,
std::ptrdiff_t FirstDimension,
std::ptrdiff_t... RestDimensions
>
class multi_span { ... };
Run Code Online (Sandbox Code Playgroud)
因此,显然这是的某种多维版本gsl::span。但是那是什么意思呢?为什么我们需要这个多维范围,或者更确切地说-我们什么时候使用它?我似乎找不到任何文档。
我可以编写一个单参数宏,它采用由空格分隔的单词/标记序列,并生成相同的序列,但每个单词/标记之间有下划线?
例如
MAGIC_MACRO(brave new world)
Run Code Online (Sandbox Code Playgroud)
将评估为
brave_new_world
Run Code Online (Sandbox Code Playgroud)
笔记:
In his Meeting C++ 2019 talk (and also in 2018), presenter Deniz Bahadir recommends that we specify targets' C++ header files using target_sources(), with some of them being PUBLIC or INTERFACE.
But - when I try to do that (using relative paths, like I used to with the good old add_target()), I get this kind of error:
CMake Warning (dev) at CMakeLists.txt:26 (target_sources):
Policy CMP0076 is not set: target_sources() command converts relative paths
to absolute. Run "cmake --help-policy …Run Code Online (Sandbox Code Playgroud) 假设我有一个floator类型的浮点值double(即典型机器上的 32 位或 64 位)。我想将此值打印为文本(例如,打印到标准输出流),然后在其他一些过程中,将其扫描回 -fscanf()如果我使用的是 C,或者istream::operator>>()如果我使用的是 C++。但是-我需要扫描的浮子最终被准确,等同于原始值(最多相同值的等价表示)。此外,打印的值应该很容易阅读 - 对人类来说 - 作为浮点数,即我不想打印 0x42355316 并将其重新解释为 32 位浮点数。
我该怎么做?我假设(C 和 C++)的标准库是不够的,但也许我错了。我想足够数量的十进制数字可能能够保证低于精度阈值的错误 - 但这与保证舍入/截断会按照我想要的方式发生不同。
笔记: