小编ein*_*ica的帖子

OpenCL 的 select 运算符有什么用?

我注意到 OpenCL 有一个select()函数/内置/运算符,它似乎类似于 C 和 C++ 中的三元运算符,但又不完全一样。select()和之间有什么区别?:,如果我们有后者,为什么还需要前者?

gpgpu simd conditional-operator opencl

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

如何使 std::variants 的使用在语法上更加“可口”?

这是受到我给新手用户的回答的启发,我建议他们使用 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++ idioms syntactic-sugar c++17 std-variant

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

字母金字塔 C++

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

c++

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

防止在大型结构之间进行不必要的复制

我有巨大的结构 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++ copy-elision c++17

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

C++ 中是否有任何日期时间模块

C++ 中是否有任何日期时间模块?
我在谷歌上研究了一下,开始了解<ctime>头文件,但它只是超出了我的头脑。

还有什么可以做我的工作吗?

c++ datetime c++11 c++-chrono c++17

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

如何将 lambda 与模板化 std::unique_ptr 一起使用?

诸如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)

c++ lambda unique-ptr c++17 tensorrt

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

为什么 printf() 在内核中可以工作,但使用 std::cout 却不能?

我一直在探索并行编程领域,并用 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

printf cuda cout sycl

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

为什么我收到有关 cudaMemcpyToArray(...) 已弃用的警告?

这个警告是什么?我该如何解决它?

\n
warning: \xe2\x80\x98cudaError_t cudaMemcpyToArray(cudaArray_t, size_t, size_t, const void*, size_t, cudaMemcpyKind)\xe2\x80\x99 is deprecated [-Wdeprecated-declarations]\n
Run Code Online (Sandbox Code Playgroud)\n

cuda compiler-warnings

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

如何访问 CUDA 中的稀疏张量核心功能?

张量核心可以通过 CUDA 中的 WMMA 接口以编程方式访问(请参阅https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#wmmahttps://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 中的稀疏张量核心功能?

cuda gpu nvidia cuda-wmma

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

我可以让 MSVC 对“C4127:条件表达式为常量”不那么严格吗

我正在使用 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 中也没有。

c++ compiler-warnings c++11 c4127 visual-studio-2019

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