小编bct*_*bct的帖子

像(void**)和device_array这样的转换有什么问题?

关于使用的另一个问题有这个答案cudaMalloc((void**)&device_array, num_bytes),它void**用作输出参数而不是void*像标准那样传递一个返回值malloc.

它批评了NVIDIA的API并声明:

如(void**)和device_array中的转换是无效的C并导致未定义的行为.

并且已被多次投票(截至目前为8),所以我认为其中有一些道理.

我不明白在那里铸造有什么问题.

  • 什么是无效的C?
  • 在什么情况下会导致未定义的行为?

我所知道的是,它在没有警告的情况下进行编译,并按照预期的行为运行.但我对C达到标准规格水平并不了解.

c cuda

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

测量 Linux 上的峰值 nvidia GPU 内存使用情况

要测量我的程序当前使用的 GPU 内存,我可以使用以下命令(ubuntu linux、nvidia GPU):

while true; do nvidia-smi --query-gpu=memory.used --format=csv; sleep .5; done|grep -v memory
Run Code Online (Sandbox Code Playgroud)

它会定期输出如下值:

70 MiB
74 MiB
75 MiB
76 MiB
77 MiB
77 MiB
70 MiB
Run Code Online (Sandbox Code Playgroud)

是否可以修改命令以始终显示最大值而不是最新值?

(如果可能的话,以仅 bash 的方式)

linux bash cuda gpu

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

使用printf/cout推力

我正在尝试学习如何使用推力的CUDA,我已经看到了一些代码,其中printf函数似乎是从设备中使用的.

考虑以下代码:

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <cstdio>

struct functor
{
  __host__ __device__
  void operator()(int val)
  {
      printf("Call for value : %d\n", val);
  }
};

int main()
{
    thrust::host_vector<int> cpu_vec(100);
    for(int i = 0 ; i < 100 ; ++i)
      cpu_vec[i] = i;
    thrust::device_vector<int> cuda_vec = cpu_vec; //transfer to GPU
    thrust::for_each(cuda_vec.begin(),cuda_vec.end(),functor());
}
Run Code Online (Sandbox Code Playgroud)

这似乎运行正常并打印100次消息"呼叫价值:"后跟一个数字.

现在如果我包含iostream并用基于C++流的等价物替换printf行

std::cout << "Call for value : " << val << std::endl;
Run Code Online (Sandbox Code Playgroud)

我收到来自nvcc的编译警告,编译后的程序不会打印任何内容.

warning: address of a host variable "std::cout" cannot be directly taken in a device …
Run Code Online (Sandbox Code Playgroud)

cuda thrust

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

标签 统计

cuda ×3

bash ×1

c ×1

gpu ×1

linux ×1

thrust ×1