我有一个 GPU 应用程序,可以在图像构建阶段进行单元测试。使用 Docker 19.03,可以指定 nvidia 运行时,docker run --gpus all
但我还需要访问 GPU,docker build
因为我进行单元测试。我怎样才能实现这个目标?
对于使用 nvidia-docker2 的旧版本 docker,无法在构建阶段指定运行时,但您可以将默认运行时设置为 nvidia,并且 docker 构建可以正常工作。我可以在不再需要 nvidia-docker 的 Docker 19.03 中执行此操作吗?如果是这样,怎么办?
给定N
元素,仅处理第一个(0)和最后一个(N-1)元素.
但是,如果N = 1
只处理单个元素一次.
使用一个或两次运行的循环,可以避免重复循环体.如果有一种可读的方法,那么它对源代码大小有好处.如果循环体很大,它也可能对机器代码大小有好处,并且编译器最终不会复制它.
我试过递增N-1
但是当N=1
(永远循环)时它不起作用.有没有技巧(反向循环fi)来解决这个问题?
for (i = 0 ; i < N ; i += (N - 1))
Run Code Online (Sandbox Code Playgroud)
我原来的问题涉及x,y,z方向的三个嵌套循环,这就是为什么我不能只处理elem [0])和elem [N-1].现在我有以下内容
#define forEachLglBound(i_,j_,k_) \
for(Int i_ = 0;i_ < NPX;i_+=((NPX>1) ? (NPX-1) : 1)) \
for(Int j_ = 0;j_ < NPY;j_+=((NPY>1) ? (NPY-1) : 1)) \
for(Int k_ = 0;k_ < NPZ;k_+=((NPZ>1) ? (NPZ-1) : 1))
Run Code Online (Sandbox Code Playgroud)
用于连接 ( ##
)的 C 预处理器宏在使用 gfortran 的 Mac 上似乎不起作用。在其他系统上使用其他 Fortran 编译器是可行的,所以我正在寻找 gfortran 的解决方法。我必须使用##
来创建许多变量,所以我不能没有它们。
示例代码:
#define CONCAT(x,y) x##y
program main
integer, parameter:: CONCAT(ID,2) = 3
print*,"Hello", ID_2
end program main
Run Code Online (Sandbox Code Playgroud)
在 MAC 上使用 gfortran 编译错误
gfortran m.F90 -o m
m.F90:5.23:
integer, parameter:: ID##2 = 3
1
Error: PARAMETER at (1) is missing an initializer
Run Code Online (Sandbox Code Playgroud) 使用命令行中的nvprof --metrics测量带宽的正确选项是什么?我正在使用flop_dp_efficiency来获得峰值FLOPS的百分比,但是手册中的带宽测量似乎有很多选项,我真的不明白我在测量什么.例如dram_read,dram_write,gld_read,gld_write对我来说都是一样的.另外,如果假设两者同时发生,我应该将bandwdith报告为读写吞吐量的总和吗?
编辑:
根据图中的优秀答案,从设备内存到内核的带宽是多少?我想在从内核到设备内存的路径上占用最小的带宽(读取+写入),这可能是L2缓存.
我试图通过测量FLOPS和带宽来确定内核是否受计算或内存限制.
当友元函数 mag() 在类内部定义时,下面显示的代码不会编译,但如果在类外部定义(已注释),则可以工作。我认为差异是由用于将参数类型从 A 更改为 B 的复制构造函数引起的。有人可以解释为什么我应该在外部定义友元函数吗?
而且,如果B类是模板类(template <class T>
在最上面添加),在外面定义友元函数也是不行的。
#include <iostream>
using namespace std;
class A {
};
class B {
public:
B(const A& p) {
std::cout << "Copy/Conversion constructor" << std::endl;
}
friend void mag(const B& p) {
std::cout << "Mag Inside`.\n";
}
};
//void mag(const B& p) {
// std::cout << "Mag Outside.\n";
//}
int main() {
A a;
mag(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)