我注意到 OpenCL 有一个select()函数/内置/运算符,它似乎类似于 C 和 C++ 中的三元运算符,但又不完全一样。select()和之间有什么区别?:,如果我们有后者,为什么还需要前者?
这是受到我给新手用户的回答的启发,我建议他们使用 anstd::variant而不是 union。
通过工会,您可能会遇到如下情况:
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
union Value {
Item item;
Boxes boxes;
};
Value contents;
std::string label;
};
Run Code Online (Sandbox Code Playgroud)
(不完全是最初的问题,我在这里接受了一些诗意的许可。)并且使用一个变体,该类可能如下所示:
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
std::variant<Item, Boxes> contents;
std::string label;
};
Run Code Online (Sandbox Code Playgroud)
问题是,使用第一个变体,我可以写
if (box.contents.boxes.size() > 2) { foo(); }
Run Code Online (Sandbox Code Playgroud)
如果我已经确定会有子框,这就会起作用。
对于std::variant,我必须写:
if (std::get<Boxes>(box.contents).size() > 2) { foo(); }
Run Code Online (Sandbox Code Playgroud)
我觉得第二个版本的可读性要差得多,有点混乱,而且很分散注意力。另外 - 我必须知道 的类型boxes。
在我的代码中,我可以做些什么来让我的用户无需进行此类std::get()调用,并使他们的生活更加愉快?
我是 C++ 初学者。我发现输入前的空格可以通过公式总行 - 当前行号来计算。但是,我无法弄清楚如何向后显示输入。我知道 C++ 不支持负索引。有人可以帮我吗?我真的很感激你的帮助。谢谢!
预期结果:
如果用户输入“ABCDEFG”,则您的程序应显示:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
ABCDEFGFEDCBA
Run Code Online (Sandbox Code Playgroud)
我目前的结果:
A
ABC
ABCDE
ABCDEFG
ABCDEFGAB
ABCDEFGABCD
ABCDEFGABCDEF
Run Code Online (Sandbox Code Playgroud)
代码:
#include <iostream>
#include <string>
int main(){
std::string user_input;
std::cout << "Please enter something" << std::endl;
std::cin >> user_input;
size_t total_row = user_input.size();
for(size_t row {1}; row <= total_row; row++){
for(size_t blank {total_row-row}; blank >= 1; blank--)
std::cout << " ";
if ( total_row <= 1){
std::cout << user_input;
}
else {
for(size_t i {0}; i …Run Code Online (Sandbox Code Playgroud) 我有巨大的结构 DataFrom 和 Data (实际上有不同的成员)。数据是从 DataFrom 创建的。
struct DataFrom{
int a = 1;
int b = 2;
};
static DataFrom dataFrom;
struct Data{
int a;
int b;
};
class DataHandler{
public:
static Data getData(const DataFrom& data2){
Data data;
setA(data, data2);
setB(data, data2);
return data;
}
private:
static void setA(Data& dest, const DataFrom& source){
dest.a = source.a;
}
static void setB(Data& dest, const DataFrom& source){
dest.b = source.b;
}
};
int main(){
auto data = DataHandler2::getData(dataFrom); // copy of whole Data …Run Code Online (Sandbox Code Playgroud) C++ 中是否有任何日期时间模块?
我在谷歌上研究了一下,开始了解<ctime>头文件,但它只是超出了我的头脑。
还有什么可以做我的工作吗?
诸如nvinfer1::IRuntime和 的NVIDIA TensorRT 对象nvinfer1::ICudaEngine不能直接存储在std::unique_ptr<>. 相反,他们有一个destroy()必须被调用的方法。
因此,要完成这项工作,您必须使用这样的删除器:
#include <NvInfer.h>
#include <cuda.h>
template<typename T>
struct NVIDIADestroyer
{
void operator()(T * t)
{
t->destroy();
}
};
template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, NVIDIADestroyer<T>>;
Run Code Online (Sandbox Code Playgroud)
而不是std::unique_ptr<T>,然后使用NVIDIAUniquePtr<T>.
到目前为止,这工作正常。然后我在清理代码时尝试做的是用 lambda 替换删除器,这样我就可以跳过定义NVIDIADestroyer结构。但我无法弄清楚如何做到这一点。我的想法是这样的:
template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
{
t->destroy();
}>;
Run Code Online (Sandbox Code Playgroud)
但这会导致以下错误消息:
TRT.hpp:52:45: error: lambda-expression in template-argument
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
^
TRT.hpp:55:2: error: template argument 2 is …Run Code Online (Sandbox Code Playgroud) 我一直在探索并行编程领域,并用 Cuda 和 SYCL 编写了基本内核。我遇到过一种情况,我必须在内核内部打印,我注意到std::cout内核内部不起作用,而实际上却起作用printf。例如,考虑以下 SYCL 代码 - 这有效 -
void print(float*A, size_t N){
buffer<float, 1> Buffer{A, {N}};
queue Queue((intel_selector()));
Queue.submit([&Buffer, N](handler& Handler){
auto accessor = Buffer.get_access<access::mode::read>(Handler);
Handler.parallel_for<dummyClass>(range<1>{N}, [accessor](id<1>idx){
printf("%f", accessor[idx[0]]);
});
});
}
Run Code Online (Sandbox Code Playgroud)
printf而如果我用它替换std::cout<<accessor[idx[0]]它会引发编译时错误,并提示 - Accessing non-const global variable is not allowed within SYCL device code.
CUDA 内核也会发生类似的情况。这让我思考,两者之间可能存在什么差异printf,以及std::coout是什么导致了这种行为。
另外假设如果我想实现一个从GPU调用的自定义打印函数,我应该怎么做?
TIA
这个警告是什么?我该如何解决它?
\nwarning: \xe2\x80\x98cudaError_t cudaMemcpyToArray(cudaArray_t, size_t, size_t, const void*, size_t, cudaMemcpyKind)\xe2\x80\x99 is deprecated [-Wdeprecated-declarations]\nRun Code Online (Sandbox Code Playgroud)\n 张量核心可以通过 CUDA 中的 WMMA 接口以编程方式访问(请参阅https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#wmma和https://developer.nvidia.com/博客/programming-tensor-cores-cuda-9/)。最近,在 Ampere 一代卡中,Nvidia 宣布能够使用稀疏矩阵执行稀疏张量运算,如下所示:https ://developer.nvidia.com/blog/acceleating-inference-with-sparsity-using-ampere-和-tensorrt/
所呈现的格式似乎采用元素对及其在四个元素段(2 位索引)内的顺序。然而,查看wmma 文档,我找不到任何提及这一点的内容,也找不到如何访问这些特殊的张量核心操作。AFAICT 的该功能的公告页面也没有说明这一点。
如何访问 cuda 中的稀疏张量核心功能?
我正在使用 MSVC 16 2019,并打开了许多警告,包括 C4127:条件表达式是常量。但是,我的代码如下所示:
template <bool B>
void foo(int x) {
if (B && x == 0) { do_stuff(); }
do_other_stuff();
}
Run Code Online (Sandbox Code Playgroud)
...当 B 为 false 时会触发警告。
我想一般保留此错误,但我不希望它在条件表达式的常量性仅由于模板实例化时无缘无故地发出警告。
注意:这个问题是相关的,但是 - 代码不会(显着)改变,所以这不是我要问的。C++17 中也没有。