如其他问题所述并根据链接,您不能再使用此功能的符号名称.现在该功能已经消失,什么时候才能使用它cudaMemCpy?你什么时候想要使用它?什么是权衡或利益?
由于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.
我似乎记得得到提示,我应该尽量避免在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)
在内核代码?
笔记:
考虑这个程序:
#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 …
在不支持异常的语言和/或库中,许多/几乎所有函数都返回一个值,表示其操作成功或失败 - 最着名的例子可能是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).我可能更喜欢这个问题吗?
编辑:
我刚刚在Google C++编码风格指南中注意到了这个项目 - 我并不太明白.
如果我将内联方法或函数放在除其他文件包含的标题之外的文件中,它将不是该类的方法; 它只能用于包含它的代码.那么为什么甚至会有这样的-inl.h文件呢?
另外,为什么我们甚至想要内联长函数呢?(即,除了模板的情况,我们必须将代码放在头文件中进行实例化)
我定义了:
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)
我能做类似上面的任何事吗?他们似乎都没有编译.
我刚看过这个:
答案表明文件为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)
(是的,有那个间距.)
我在这做错了什么?
C++ 17将包括std::byte一种用于一个可原子寻址的存储器单元的类型,在典型的计算机上具有8位.
在这种标准化之前,指向"原始"内存时已经存在一些困境 - 在一方面使用char*/ unsigned char*另一方面void *.现在,void *删除了偏好的原因之一- std::byte没有与a相同的内涵char; 它是关于原始内存,而不是字符.
所以,我的问题是:什么是一个很好的经验法则std::byte,关于何时更喜欢它void *以及什么时候相反?
当然,当你处理旧代码或C代码时,你会受到它所接受的约束; 我主要是指新代码,您可以选择所有类型.
我正在编译一个二进制文件,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)
这是什么意思?我该怎么办?
c++ ×5
c ×4
cmake ×2
cuda ×2
byte ×1
c++11 ×1
c++17 ×1
clang ×1
conventions ×1
double ×1
fast-math ×1
function ×1
gcc ×1
glob ×1
header ×1
header-files ×1
idiomatic ×1
inline ×1
nan ×1
optimization ×1
performance ×1
return-value ×1
typedef ×1
types ×1
visual-c++ ×1