关于使用的另一个问题有这个答案cudaMalloc((void**)&device_array, num_bytes),它void**用作输出参数而不是void*像标准那样传递一个返回值malloc.
它批评了NVIDIA的API并声明:
如(void**)和device_array中的转换是无效的C并导致未定义的行为.
并且已被多次投票(截至目前为8),所以我认为其中有一些道理.
我不明白在那里铸造有什么问题.
我所知道的是,它在没有警告的情况下进行编译,并按照预期的行为运行.但我对C达到标准规格水平并不了解.
要测量我的程序当前使用的 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 的方式)
我正在尝试学习如何使用推力的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)