我使用了以下方法,期望避免从主机到设备的memcpy。推力库是否确保在此过程中从主机到设备不会有memcpy?
void EScanThrust(float * d_in, float * d_out)
{
thrust::device_ptr<float> dev_ptr(d_in);
thrust::device_ptr<float> dev_out_ptr(d_out);
thrust::exclusive_scan(dev_ptr, dev_ptr + size, dev_out_ptr);
}
此处d_in
和d_out
使用cudaMalloc
准备,d_in
使用cudaMemcpy
填充数据,然后再调用此函数
答案 0 :(得分:2)
推力库是否确保在此过程中从主机到设备不会有memcpy?
您展示的代码不应涉及任何主机 - >设备复制。 (怎么可能?你所显示的代码中的任何主机数据都没有引用。)
对于实际代码,使用profiler验证基础CUDA活动很容易,例如:
nvprof --print-gpu-trace ./my_exe
如果您保持简短的代码序列短,那么很容易将基础CUDA活动与生成该活动的推力代码对齐。如果您只想分析较长序列的一小段,那么您可以turn profiling on and off或使用NVTX markers来识别分析器输出中的所需范围。