小编ein*_*ica的帖子

cudaMemcpyToSymbol与cudaMemcpy为何仍然存在(cudaMemcpyToSymbol)

如其他问题所述并根据链接,您不能再使用此功能的符号名称.现在该功能已经消失,什么时候才能使用它cudaMemCpy?你什么时候想要使用它?什么是权衡或利益?

http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group_ CUDART _MEMORY_gf268fa2004636b6926fdcd3189152a14.html

cuda

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

如果喜欢使用-ffast-math,那么double的好哨兵值

由于gcc选项-ffast-math有效地禁止NaN-/+inf,我在寻找可能的表示下一个最好的选择,NaN在我的性能关键数学代码.理想情况下,如果对(add,mul,div,sub等)进行操作,哨兵值会产生哨兵值,NaN但我怀疑这是可能的,因为我认为这NaN是实现这一目标的唯一价值. -0.0可能不太适合,因为它也被禁用,-ffast-math并可能阻止某些优化,如(x+0.0)等.

也许我的问题应该是,是否有任何方法可以使用NaN或其他"特殊双重",同时能够启用大量的数学优化而不会崩溃?

系统是Linux/x64, gcc 4.8.1.

c double optimization nan fast-math

10
推荐指数
1
解决办法
972
查看次数

在CUDA内核中使用char变量是否会受到惩罚?

我似乎记得得到提示,我应该尽量避免在CUDA内核中使用char,因为SM喜欢32位整数.使用它们会有一些速度惩罚吗?例如,它做得慢

int a[4];
int b = a[0] + a[1] + a[2] + a[3];
a[1] = a[3];
a2[0] = a[0]
Run Code Online (Sandbox Code Playgroud)

char a[4];
char b = a[0] + a[1] + a[2] + a[3];
a[1] = a[3];
a2[0] = a[0]
Run Code Online (Sandbox Code Playgroud)

在内核代码?

笔记:

  • 我对使用char值进行算术,执行比较以及读取和写入内存的惩罚感兴趣.

c c++ performance types cuda

10
推荐指数
1
解决办法
3293
查看次数

nullptr 可以转换为 uintptr_t 吗?不同的编译器不同意

考虑这个程序:

#include <cstdint>
using my_time_t = uintptr_t;

int main() {
    const my_time_t t = my_time_t(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

使用 msvc v19.24 编译失败:

<source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t'
<source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type
<source>(5): error C2789: 't': an object of const-qualified type must be initialized
<source>(5): note: see declaration of 't'

Compiler returned: 2
Run Code Online (Sandbox Code Playgroud)

但是 clang (9.0.1) 和 gcc (9.2.1) “吃”了这段代码,没有任何错误。

我喜欢 MSVC 的行为,但是否符合标准?换句话说,它是 clang/gcc …

c++ gcc clang visual-c++ c++11

10
推荐指数
2
解决办法
845
查看次数

在每次调用函数后,如何避免/减轻返回值检查的痛苦?

在不支持异常的语言和/或库中,许多/几乎所有函数都返回一个值,表示其操作成功或失败 - 最着名的例子可能是UN*X系统调用,例如open()or chdir()或某些libc函数.

无论如何,当我编写C代码时,它通常看起来像这样:

int retval;
...
retval = my_function(arg1, arg2);
if (retval != SUCCESS_VALUE) { do_something(); }

retval = my_other_function(arg1, arg2);
if (retval != SUCCESS_VALUE) { do_something_else(); }
Run Code Online (Sandbox Code Playgroud)

现在,我想要的是不要将retval保存在任何地方并且在异常中抛出错误,但我不能拥有它.什么是下一个最好的东西?我知道这个问题没有真正的解决办法,但我还是想做点什么.

一些想法:

  • 试着和我们一起生活assert()(但那不是生产代码,不能只是死).
  • 使用宏或返回值检查功能调用函数调用,例如ensure_success(my_function(args)ensure_success(my_other_function(args),my_error_handler,error_handler_args).

我可能更喜欢这个问题吗?

编辑:

  • 是的,我正在编写C代码.我尊重你的观点,我应该尽量避免在C中写作,但那真的不具有建设性.这不是一个语言战争的问题,请不要成为一个问题.
  • 我不是在问什么是最好的事情,我只想要更多的可能性.(我会选择一个我喜欢的,其他人可能会选择别的东西.)

c error-handling conventions return-value

9
推荐指数
1
解决办法
869
查看次数

我什么时候应该使用-inl.h文件?

我刚刚在Google C++编码风格指南中注意到了这个项目 - 我并不太明白.

如果我将内联方法或函数放在除其他文件包含的标题之外的文件中,它将不是该类的方法; 它只能用于包含它的代码.那么为什么甚至会有这样的-inl.h文件呢?

另外,为什么我们甚至想要内联长函数呢?(即,除了模板的情况,我们必须将代码放在头文件中进行实例化)

c++ inline header header-files

9
推荐指数
3
解决办法
4174
查看次数

我可以在函数定义中使用函数typedef吗?

我定义了:

typedef int FunkyFunc(int x);
Run Code Online (Sandbox Code Playgroud)

现在,我希望能够在类型函数的定义中使用此typedef FunkyFunc,例如

FunkyFunc f {
    return 2*x;
}
Run Code Online (Sandbox Code Playgroud)

要么

FunkyFunc f(int x) {
    return 2*x;
}
Run Code Online (Sandbox Code Playgroud)

要么

FunkyFunc f(x) {
    return 2*x;
}
Run Code Online (Sandbox Code Playgroud)

我能做类似上面的任何事吗?他们似乎都没有编译.

c c++ typedef function

9
推荐指数
2
解决办法
2742
查看次数

将文件夹下的所有文件添加到CMake glob?

我刚看过这个:

CMake - 自动将文件夹中的所有文件添加到目标?

答案表明文件为glob,例如:

file(GLOB "*.h" "*.cpp")
Run Code Online (Sandbox Code Playgroud)

现在,如果我希望我的目标依赖于特定文件夹下某种类型的所有文件 - 可能在多个子文件夹中,该怎么办?我试过用

execute_process(COMMAND find src/baz/ -name "*.cpp" OUTPUT_VARIABLE BAR)
Run Code Online (Sandbox Code Playgroud)

然后

add_executable(foo ${BAR}
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

找不到源文件:

  src/baz/some/file/here

src/baz/some/other_file/here

src/baz/some/other_file/here2
Run Code Online (Sandbox Code Playgroud)

(是的,有那个间距.)

我在这做错了什么?

glob cmake build-dependencies

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

使用std :: byte标准化,我们何时使用void*和一个字节*?

C++ 17将包括std::byte一种用于一个可原子寻址的存储器单元的类型,在典型的计算机上具有8位.

在这种标准化之前,指向"原始"内存时已经存在一些困境 - 在一方面使用char*/ unsigned char*另一方面void *.现在,void *删除了偏好的原因之一- std::byte没有与a相同的内涵char; 它是关于原始内存,而不是字符.

所以,我的问题是:什么是一个很好的经验法则std::byte,关于何时更喜欢它void *以及什么时候相反?


当然,当你处理旧代码或C代码时,你会受到它所接受的约束; 我主要是指新代码,您可以选择所有类型.

c++ byte idiomatic c++17

9
推荐指数
1
解决办法
1391
查看次数

CMake 拒绝第二个 target_link_libraries 谈论“关键字”与“普通”

我正在编译一个二进制文件,target_link_libraries()出于各种原因,我想在两个不同的命令中添加它的依赖库。

我的命令如下所示:

target_link_libraries(my_prog PRIVATE foo bar)
target_link_libraries(my_prog baz)
Run Code Online (Sandbox Code Playgroud)

我得到错误:

  The keyword signature for target_link_libraries has already been used with
  the target "my_prog".  All uses of target_link_libraries with a target
  must be either all-keyword or all-plain.

  The uses of the keyword signature are here:

   * tests/CMakeLists.txt:10 (target_link_libraries)
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我该怎么办?

cmake build-dependencies

9
推荐指数
1
解决办法
7504
查看次数