小编ein*_*ica的帖子

在 CUDA 中交换两个寄存器变量的有效方法是什么?

我开始写一些 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 用于此功能吗?

笔记:

  • 是的,我希望它为所有线程运行。
  • 不要在意我是否有足够的寄存器。假设我有它们。

c++ swap cuda

6
推荐指数
2
解决办法
4578
查看次数

为什么我对CUDA数学库sqrt()函数的调用失败了?

我是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

c c++ math cuda square-root

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

为什么要使用mmap而不是fread?

为什么/何时使用更好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)

c streaming mmap file

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

CUDA 流与设备相关吗?如何获取流的设备?

我有一个 CUDA 流,有人递给我 - 一个cudaStream_t值。CUDA运行时 API似乎没有指示我如何获取与该流关联的设备的索引。

现在,我知道这cudaStream_t只是一个指向驱动程序级流结构的指针,但我不太愿意深入研究驱动程序。有一个惯用的方法来做到这一点吗?或者有什么好的理由不想这样做?

编辑:这个问题的另一个方面是流是否确实与设备相关联,在这种方式中,CUDA 驱动程序本身可以根据给定的指向结构确定设备的标识。

cuda multi-gpu cuda-streams

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

多子弹 Doxygen @note?

在非 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

comments idioms doxygen multiple-entries

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

在您构建的库上使用 CMake 中的 --whole-archive

我有一个 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命令将看到一个奇怪的字符串,而不是另一个目标的标识符。

build cmake ld build-dependencies

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

gsl :: multi_span用于什么?

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。但是那是什么意思呢?为什么我们需要这个多维范围,或者更确切地说-我们什么时候使用它?我似乎找不到任何文档。

c++ cpp-core-guidelines

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

在宏中用下划线替换空格?

我可以编写一个单参数宏,它采用由空格分隔的单词/标记序列,并生成相同的序列,但每个单词/标记之间有下划线?

例如

MAGIC_MACRO(brave new  world)
Run Code Online (Sandbox Code Playgroud)

将评估为

brave_new_world
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我不介意每个空白字符是否变成下划线,只是至少使用一个。
  • 如果我不能做到这一点,我至少想知道这是否可以用两个词来实现。

macros c-preprocessor

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

我真的应该将头文件指定为 target_sources() 吗?

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)

c++ cmake header-files buildconfiguration

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

如何打印浮点值以供以后以完美的精度进行扫描?

假设我有一个floator类型的浮点值double(即典型机器上的 32 位或 64 位)。我想将此值打印为文本(例如,打印到标准输出流),然后在其他一些过程中,将其扫描回 -fscanf()如果我使用的是 C,或者istream::operator>>()如果我使用的是 C++。但是-我需要扫描的浮子最终被准确,等同于原始值(最多相同值的等价表示)。此外,打印的值应该很容易阅读 - 对人类来说 - 作为浮点数,即我不想打印 0x42355316 并将其重新解释为 32 位浮点数。

我该怎么做?我假设(C 和 C++)的标准库是不够的,但也许我错了。我想足够数量的十进制数字可能能够保证低于精度阈值的错误 - 但这与保证舍入/截断会按照我想要的方式发生不同。

笔记:

  • 扫描不必完全准确,只需扫描原始值即可。
  • 如果它更容易,您可以假设该值是一个数字而不是无穷大。
  • 非正常支持是需要的,但不是必需的;如果我们得到一个异常,失败应该是显而易见的。

c floating-point precision numeric

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