小编use*_*436的帖子

并发CUDA内核执行的优先级

我有两个可以同时执行的内核(A 和 B)。我需要内核 A 尽快完成(以进行结果的 MPI 交换)。所以我可以在一个流中执行它们:A,然后 B。

但是,内核 A 的线程块很少,因此如果我顺序运行 A 和 B,则在 A 运行时 GPU 不会得到充分利用。

是否可以同时执行A和B,并且A具有更高的优先级?

即,我希望仅当内核A 中没有未启动的块时,内核 B 中的线程块才开始执行。

据我了解,如果我在一个流中启动内核 A,然后在主机代码的下一行中在另一个流中启动内核 B,我不能保证 B 中的线程块实际上不会首先执行?

concurrency cuda gpu

4
推荐指数
1
解决办法
3790
查看次数

引用计数(不存储任何数据)

我需要在我的班级中有一个共享计数器(当计数器变为零时调用某个函数).我可以使用shared_ptr<char>带有删除器的那个,但是这种方法有分配不需要的char并且保持指针的开销.

基本上,我需要引用计数的一部分shared_ptr.我不知道如何利用shared_ptr并避免这种开销.

std共享计数器是否有可移植的C++ 11实现(即,使用标准的c ++ 11,只有标准的互斥锁等)?

PS.计数器不是整个班级独有的.我可能有我班级的对象a1,a2,a3共享同一个计数器.与b1,b2,b3共享不同的计数器.因此,当a1,a2,a3中的最后一个超出范围时(与a1,a2,a3相关)应该发生.当b1,b2,b3中的最后一个超出范围时,应该发生某些事情(与b1,b2,b3相关).

谢谢

c++ reference-counting shared-ptr c++11

4
推荐指数
1
解决办法
249
查看次数

CUDA注册用法

CUDA手册指定每个多处理器的32位寄存器的数量.这是否意味着:

  1. 双变量需要两个寄存器?

  2. 指针变量需要两个寄存器? - 它必须是Fermi上不止一个具有6 GB内存的寄存器,对吧?

  3. 如果对问题2的回答是肯定的,那么使用较少的指针变量和更多的int索引一定更好.

    例如,这个内核代码:

    float* p1;               // two regs
    float* p2 = p1 + 1000;   // two regs
    int i;                   // one reg
    for ( i = 0; i < n; i++ )
    {
        CODE THAT USES p1[i] and p2[i]
    }
    
    Run Code Online (Sandbox Code Playgroud)

    理论上需要比这个内核代码更多的寄存器:

    float* p1;               // two regs
    int i;                   // one reg
    int j;                   // one reg
    for ( i = 0, j = 1000; i < n; i++, j++ )
    { …
    Run Code Online (Sandbox Code Playgroud)

cuda gpu

3
推荐指数
1
解决办法
3623
查看次数

C++11 右值参考题

我正在尝试了解 C++11 的新特性,我有两个关于右值引用的问题。

  1. 我还没有看到函数返回右值引用的例子(除了std::move)。是否有这样做有意义的情况?例如,int&& foo(...)

  2. 在声明局部变量或作为函数参数时,是否存在对 const 进行右值引用有意义的情况?例如,foo(int const&& i)

c++ reference rvalue-reference c++11

3
推荐指数
1
解决办法
190
查看次数

C/C++:异常终止前刷新输出

是否需要在调用之前显式刷新输出流abort()以避免输出丢失?

据我所知,由于stderr没有缓冲,所以abort在输出后调用stderr/ cerr应该没问题.怎么样的stdout/ cout,或我打开的文件?

PS.我在Linux环境中工作(如果重要的话).

c c++ io abort

3
推荐指数
1
解决办法
1716
查看次数

C++ 11:如果使用make_shared构造对象,如何删除对象

我遗漏了一些关于共享/弱指针的东西:

当使用shared_ptr构造a时make_shared,仅使用一个内存分配(为控制块和对象本身分配内存).当最后一次shared_ptr被摧毁但是还weak_ptr剩下什么时会发生什么?此时必须取消分配托管对象.但是如果分配的内存make_shared被释放,那将使弱指针无效,因为相同的释放会破坏控制块.

c++ reference-counting shared-ptr weak-ptr c++11

3
推荐指数
1
解决办法
380
查看次数

两个具有相同内容的 unordered_set-s 的迭代顺序是否保证相同

如果我有两个unordered_set具有相同内容的变量(如果已排序),但创建方式不同(例如,第一个变量仅插入了项目,第二个变量以不同的顺序插入、删除了项目等,但两个变量最终都具有相同的内容),迭代这两个变量会产生相同顺序的值吗?

附言。这个问题与迭代相同的无序集合两次的类似问题不同。

c++ unordered-map unordered-set language-lawyer c++11

3
推荐指数
1
解决办法
327
查看次数

std::memset 计数为零且指针无效

当等于 0时,std::memset(pointer, ch, count)使用无效指针(例如,nullptr或垃圾)调用是否安全?count

c++

3
推荐指数
1
解决办法
126
查看次数

C++ bool to int cast和GCC 4.8.1

我是否正确地理解boolint投应该投true1

GCC 4.8.1为此代码提供了奇怪的结果:

#include <array>
#include <iostream>

int main()
{
    using namespace std;

    array<bool, 3> bb;
    for ( int i = 0; i < 3; i++ ) cout << static_cast<int>( bb[i] ) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

>> g++ -std=c++11 test_bool.cpp  -pedantic -O3
>> ./a.out 
136
251
160
Run Code Online (Sandbox Code Playgroud)

c++ gcc type-conversion

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

在 Cuda 中使用最大共享内存

我无法使用超过 48K 的共享内存(在 V100、Cuda 10.2 上)

我打电话

cudaFuncSetAttribute(my_kernel,
                     cudaFuncAttributePreferredSharedMemoryCarveout,
                     cudaSharedmemCarveoutMaxShared);
Run Code Online (Sandbox Code Playgroud)

my_kernel第一次启动之前。

我在内部使用启动边界和动态共享内存my_kernel

__global__
void __launch_bounds__(768, 1)
my_kernel(...)
{
    extern __shared__ float2 sh[];
    ...
}
Run Code Online (Sandbox Code Playgroud)

内核是这样调用的:

dim3 blk(32, 24); // 768 threads as in launch_bounds.

my_kernel<<<grd, blk, 64 * 1024, my_stream>>>( ... );
Run Code Online (Sandbox Code Playgroud)

cudaGetLastError()内核调用返回后cudaErrorInvalidValue

如果我使用 <= 48 K 的共享内存(例如,my_kernel<<<grd, blk, 48 * 1024, my_stream>>>),它就可以工作。

编译标志是:

nvcc -std=c++14 -gencode arch=compute_70,code=sm_70 -Xptxas -v,-dlcm=cg

我错过了什么?

cuda

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

Typetrait 获取连续内存容器的值类型

我需要一个 typetrait 来为以下“连续内存”类型(operator[]可以应用)返回值类型:

std::vector<T, Args...>, std::array<T, N>, T[], T[N], 和T*(可能带有 CV 限定符,如T* const)。特征应该T为所有上述类型返回。

在 C++17 中是否有比下面乏味的实现更简洁的实现?就像以某种方式将所有指针案例收集在一个专业化和应用std::remove_ptr中一样,对于T[N]with 也是如此std::remove_extent

template<class T> struct remove_array_like;
template<class T> struct remove_array_like<T*> { using type = T; };
template<class T> struct remove_array_like<T* const> { using type = T; };
template<class T> struct remove_array_like<T* volatile> { using type = T; };
template<class T> struct remove_array_like<T* const volatile> { using type …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits c++17

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

针对特定警告撤消 -Werror

我使用-Werror ... -Wno-unknown-pragmas编译器标志(因为我不需要未知的编译指示来导致错误)。

然而,这会消除所有未知的编译指示警告。

有没有办法产生-Wunknown-pragmas警告,同时不将其变成错误,并应用于-Werror所有其他警告。

c c++ gcc clang icc

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

std::sort 空向量

std::sort认为如果它得到一个空的范围内正常工作?

我收到此代码的分段错误(gcc 4.8.3):

std::vector<float> f;
std::sort( f.begin() + 1, f.end() );
Run Code Online (Sandbox Code Playgroud)

标准说对于空向量begin()end()返回相同的值。所以我希望sort在上面的情况下什么都不做,因为它应该得到一个空范围:begin()+1应该大于end().

这种空范围排序没有问题:

std::sort( f.begin(), f.end() );
Run Code Online (Sandbox Code Playgroud)

c++ sorting vector c++11

-4
推荐指数
1
解决办法
3838
查看次数