小编ein*_*ica的帖子

我可以告诉nvcc将#pragma unroll应用于函数中的所有循环吗?

我有一个CUDA内核,有一堆我想要展开的循环.现在我做:

void mykernel(int* in, int* out, int baz) {    
    #pragma unroll
    for(int i = 0; i < 4; i++) {
        foo();
    }
    /* ... */
    #pragma unroll
    for(int i = 0; i < 6; i++) {
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

等等.我想告诉(提示)我的C/C++编译器展开所有这些循环,而不需要为每个循环单独提示.但是,我不希望在该函数中展开文件中所有代码中的所有循环.

如果这是GCC,我可以这样做:

__attribute__((optimize("unroll-loops")))
void mykernel(int* in, int* out, int baz) {    
    for(int i = 0; i < 4; i++) {
        foo();
    }
    /* ... */
    for(int i = 0; i < 6; i++) {
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用选项push-and-popping.我能用CUDA做些什么吗?

c++ optimization cuda compiler-directives loop-unrolling

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

如何使用更新站点将 Eclipse 插件下载为 zip 存档?

我在 Internet 上的一个盒子上安装了 Eclipse。

我找到了我想安装的这个包,但我只有它的更新 URL,没有存档文件,我可以复制到断开连接的机器上,并dropins/像其他一些扩展一样放入它的 Eclipse文件夹中。

在连接到 Internet 的机器上,我如何获取/创建存档文件,只能访问更新 URL?

笔记:

  • 我尝试制作更新站点的本地镜像,如此问题的答案中所述,但这对我来说并不奏效。镜像仍然指向远程存储库,而 Eclipse 试图去那里。
  • 请不要假设任何机器的操作系统和配置(不要假设两台机器是相同的)。

eclipse offline eclipse-plugin

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

使用variadic-template函数计算多个值的平均值

我正在尝试编写一个函数来确定任意数量的参数的平均值,所有这些参数都具有相同的类型.出于学习目的,我试图使用可变参数模板函数来做到这一点.

这是我到目前为止:

template<typename T, class ... Args>
T Mean(Args ... args)
{
    int numArgs = sizeof...(args);
    if (numArgs == 0)
        return T();           // If there are no arguments, just return the default value of that type

    T total;
    for (auto value : args...)
    {
        total += value;
    }

    return total / numArgs;   // Simple arithmetic average (sum divided by total)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它(使用MS Visual Studio 2013)时,我收到以下编译错误:

error C3520: 'args' : parameter pack must be expanded in this context (test.cpp)
Run Code Online (Sandbox Code Playgroud)

我该如何正确"解包" args …

c++ average variadic-templates c++11

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

cudaMallocManaged vs cudaMalloc - 设备内存限制方案

据我所知,cudaMallocManaged通过消除主机和设备上显式内存分配的需要,简化了内存访问.考虑主机内存明显大于设备内存的情况,例如16 GB主机和2 GB设备,这些现在相当常见.如果我正在处理从外部数据源读取的大尺寸输入数据,例如4-5 GB.我是否被迫采用明确的主机和设备内存分配(因为设备内存不足以同时容纳)或者CUDA统一内存模型是否有办法解决这个问题(例如,根据需要自动分配/解除分配)?

memory malloc memory-management cuda

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

cuda warp size and control divergence

我有关于以下问题的查询:

假设我们有一个9*7图片(x方向7像素,y方向9像素),假设4*4线程块和每个warp 8个线程,有多少warp将有控制偏差?

这里如何组织块和经线?对于x或水平方向,我可以假设每行2个块.类似地,对于垂直方向,每列3个块.但是,经线将如何组织?有人可以指出warp的线程id,以及控制分歧发生的情况(Thread ids等).

谢谢

cuda gpu-warp

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

Haswell核心可以同时执行多少32位整数运算?

在准备一些演示文稿的背景下,我想到我不知道Haswell核心可以同时执行的整数运算次数的理论极限.

我曾经天真地假设"英特尔核心有HT,但这可能是并行化不同类型的工作,所以可能核心最大化其与256位AVX操作的并行性,所以8个整数运算可以在每个时钟周期发出(并假设不错流水线,8完成)." - 所以8个操作/循环.

但后来我注意到这篇文章,它告诉我Haswells(和Sandy Bridges)有3个调度端口可以提供向量单元.那么真正的数字24整数运算/周期?

PS - 我意识到在实践中你可能需要实际从内存中读取所有数据,其带宽将是限制因素.或者QPI太慢了.

cpu x86 simd cpu-speed avx

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

为什么需要包含&lt;stdio.h&gt;才能使用CUDA的printf()?

我想要printf()CUDA内核中的某些内容。[《编程指南》建议[1]:

#include <stdio.h>

__global__ void helloCUDA(float f)
{
    printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}
Run Code Online (Sandbox Code Playgroud)

但这只是包括标准C库的stdio.h。为什么那是必要的?CUDA的printf()行为与stdio的行为不同printf();我当然不需要那里的所有其他东西。

c++ printf cuda gpu-programming

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

将当前编译器转发到ExternalProject

我试图使用ExternalProject模块:

ExternalProject_Add( googlebenchmark
                 GIT_REPOSITORY "https://github.com/google/benchmark.git"
                 TLS_VERIFY ON
                 CMAKE_CACHE_DEFAULT_ARGS -DBENCHMARK_ENABLE_TESTING:BOOL=OFF
                 SOURCE_DIR "${CMAKE_BINARY_DIR}/third_party/gbenchmark"
                 INSTALL_DIR "${CMAKE_BINARY_DIR}/third_party" )`
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题:由于某种原因,该模块不会转发在(父)cmake 以及 CMAKE_BUILD_TYPE 中使用的编译器。

我尝试使用 CMAKE_CACHE_DEFAULT_ARGS 直接设置 CMAKE_CXX_COMPILER,但它并没有安静地解决。

对于这种行为有一个合理的解释吗?是否有正确的(cmake-ish)方法将当前使用的编译器/构建配置转发到ExternalProject?

cmake external-project

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

将__builtin_expect委托给内联函数是否安全?

我正在研究一些定义的C ++代码

#define LIKELY(x)   (__builtin_expect((x), 1))
Run Code Online (Sandbox Code Playgroud)

我想知道-为什么不使用内联函数?即为什么不

template <typename T> inline T likely(T x) { return __builtin_expect((x), 1); }
Run Code Online (Sandbox Code Playgroud)

(或许

inline int likely(int x) { return __builtin_expect((x), 1); }
Run Code Online (Sandbox Code Playgroud)

因为x应该是某些条件检查的结果)

宏和函数应该基本相同,对吗?但是后来我想知道:也许是因为__builtin_expect...在内联辅助函数中工作的不同吗?

c++ built-in gcc-extensions

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

无法覆盖使用模板参数包扩展声明的虚方法

我无法覆盖使用模板参数包扩展指定的基类的虚方法 - 而重写方法将显示实际的相关类型.这是一个MCVE:

#include <iostream>
template <typename... Ts>
class A { virtual void foo(Ts&&...); };

class B : public A<int, unsigned> {
    void foo(int x, unsigned y) override { std::cout << "here"; }
};

int main() {
    B b;
}
Run Code Online (Sandbox Code Playgroud)

编译它(标准设置为C++ 11或C++ 14),我得到:

a.cpp:9:7: error: ‘void B::foo(int, unsigned int)’ marked override, but does not override
  void foo(int x, unsigned y) override {
       ^
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions variadic-functions variadic-templates c++11

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