- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题几乎与[之前在 SO 此处询问][1] 的问题相同。但是没有提供任何答案,所以我要问一个单独的问题。
我在 Windows-7 操作系统上使用 CUDA 7.0 工具包。我正在使用 VS-2013。
我尝试生成 vector 加法示例程序的时间线并且成功了。但是当我按照完全相同的步骤生成我自己的代码的时间线时,它会一直显示一条消息“正在运行应用程序以生成时间线”。我知道内核被调用并且一切正常。
cudaDeviceReset()
在完成与 CUDA 相关的所有事情后,调用也在那里。
程序:我已经更改了我原来的问题以提供一个可以产生相同问题的最小工作示例。以下代码未使用 nvvp
生成时间线,无论我放置 cudaDeviceReset()
的位置如何。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
//OpenCV
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <stdio.h>
using namespace cv;
__global__ void colorTransformation_kernel(int numChannels, int iw, int ih, unsigned char *ptr_source, unsigned char *ptr_dst)
{
// Calculate our pixel's location
int x = (blockIdx.x * blockDim.x) + threadIdx.x;
int y = (blockIdx.y * blockDim.y) + threadIdx.y;
// Operate only if we are in the correct boundaries
if (x >= 0 && x < iw && y >= 0 && y < ih)
{
ptr_dst[numChannels* (iw*y + x) + 0] = ptr_source[numChannels* (iw*y + x) + 0];
ptr_dst[numChannels* (iw*y + x) + 1] = ptr_source[numChannels* (iw*y + x) + 1];
ptr_dst[numChannels* (iw*y + x) + 2] = ptr_source[numChannels* (iw*y + x) + 2];
}
}
int main()
{
while (1)
{
Mat image(400, 400, CV_8UC3, Scalar(0, 0, 255));
unsigned char *h_src = image.data;
size_t numBytes = image.rows * image.cols * 3;
int numChannels = 3;
unsigned char *dev_src, *dev_dst, *h_dst;
//Allocate memomry at device for SOURCE and DESTINATION and get their pointers
cudaMalloc((void**)&dev_src, numBytes * sizeof(unsigned char));
cudaMalloc((void**)&dev_dst, numBytes * sizeof(unsigned char));
////Copy the source image to the device i.e. GPU
cudaMemcpy(dev_src, h_src, numBytes * sizeof(unsigned char), cudaMemcpyHostToDevice);
////KERNEL
dim3 numOfBlocks(3 * (image.cols / 20), 3 * (image.rows / 20)); //multiplied by 3 because we have 3 channel image now
dim3 numOfThreadsPerBlocks(20, 20);
colorTransformation_kernel << <numOfBlocks, numOfThreadsPerBlocks >> >(numChannels, image.cols, image.rows, dev_src, dev_dst);
cudaDeviceSynchronize();
//Get the processed image
Mat org_dijSDK_img(image.rows, image.cols, CV_8UC3);
h_dst = org_dijSDK_img.data;
cudaMemcpy(h_dst, dev_dst, numBytes * sizeof(unsigned char), cudaMemcpyDeviceToHost);
//DISPLAY PROCESSED IMAGE
imshow("Processed dijSDK image", org_dijSDK_img);
waitKey(33);
}
cudaDeviceReset();
return 0;
}
非常重要的线索:如果我注释行 while(1)
并因此只运行一次代码,nvvp
会生成时间线.但是在我原来的项目中,我无法通过这样做获得时间线配置文件,因为它包含多线程和其他东西,因此在第一次运行期间没有要处理的图像。因此,我必须需要一些方法来使用包含无限 while 循环
的代码生成时间线。
最佳答案
我的代码中的问题是无休止的 while 循环
,因此从未调用过 cudaDeviceReset()
。有两种可能的解决方案来处理这种情况:
如果您有兴趣只在那时查看时间线分析,只需注释您的 while 循环
并且 nvvp
将能够到达 cudaDeviceReset()
出现在 main()
的末尾。
可能会有这样一种情况,您必须在程序中保留一个循环。例如,在我包含多线程的原始项目中,在 while 循环
的初始 180 运行期间没有要处理的图像。要处理这种情况,请将您的 while 循环替换为可以运行有限次数的 for 循环
。例如,以下代码帮助我获得了 4 次运行的时间线分析。我只发布修改后的 main()
。
int main()
{
cudaStream_t stream_one;
cudaStream_t stream_two;
cudaStream_t stream_three;
//while (1)
for (int i = 0; i < 4; i++)
{
cudaStreamCreate(&stream_one);
cudaStreamCreate(&stream_two);
cudaStreamCreate(&stream_three);
Mat image = imread("DijSDK_test_image.jpg", 1);
//Mat image(1080, 1920, CV_8UC3, Scalar(0,0,255));
size_t numBytes = image.rows * image.cols * 3;
int numChannels = 3;
int iw = image.rows;
int ih = image.cols;
size_t totalMemSize = numBytes * sizeof(unsigned char);
size_t oneThirdMemSize = totalMemSize / 3;
unsigned char *dev_src_1, *dev_src_2, *dev_src_3, *dev_dst_1, *dev_dst_2, *dev_dst_3, *h_src, *h_dst;
//Allocate memomry at device for SOURCE and DESTINATION and get their pointers
cudaMalloc((void**)&dev_src_1, (totalMemSize) / 3);
cudaMalloc((void**)&dev_src_2, (totalMemSize) / 3);
cudaMalloc((void**)&dev_src_3, (totalMemSize) / 3);
cudaMalloc((void**)&dev_dst_1, (totalMemSize) / 3);
cudaMalloc((void**)&dev_dst_2, (totalMemSize) / 3);
cudaMalloc((void**)&dev_dst_3, (totalMemSize) / 3);
//Get the processed image
Mat org_dijSDK_img(image.rows, image.cols, CV_8UC3, Scalar(0, 0, 255));
h_dst = org_dijSDK_img.data;
//copy new data of image to the host pointer
h_src = image.data;
//Copy the source image to the device i.e. GPU
cudaMemcpyAsync(dev_src_1, h_src, (totalMemSize) / 3, cudaMemcpyHostToDevice, stream_one);
cudaMemcpyAsync(dev_src_2, h_src + oneThirdMemSize, (totalMemSize) / 3, cudaMemcpyHostToDevice, stream_two);
cudaMemcpyAsync(dev_src_3, h_src + (2 * oneThirdMemSize), (totalMemSize) / 3, cudaMemcpyHostToDevice, stream_three);
//KERNEL--stream-1
callMultiStreamingCudaKernel(dev_src_1, dev_dst_1, numChannels, iw, ih, &stream_one);
//KERNEL--stream-2
callMultiStreamingCudaKernel(dev_src_2, dev_dst_2, numChannels, iw, ih, &stream_two);
//KERNEL--stream-3
callMultiStreamingCudaKernel(dev_src_3, dev_dst_3, numChannels, iw, ih, &stream_three);
//RESULT copy: GPU to CPU
cudaMemcpyAsync(h_dst, dev_dst_1, (totalMemSize) / 3, cudaMemcpyDeviceToHost, stream_one);
cudaMemcpyAsync(h_dst + oneThirdMemSize, dev_dst_2, (totalMemSize) / 3, cudaMemcpyDeviceToHost, stream_two);
cudaMemcpyAsync(h_dst + (2 * oneThirdMemSize), dev_dst_3, (totalMemSize) / 3, cudaMemcpyDeviceToHost, stream_three);
// wait for results
cudaStreamSynchronize(stream_one);
cudaStreamSynchronize(stream_two);
cudaStreamSynchronize(stream_three);
//Assign the processed data to the display image.
org_dijSDK_img.data = h_dst;
//DISPLAY PROCESSED IMAGE
imshow("Processed dijSDK image", org_dijSDK_img);
waitKey(33);
}
cudaDeviceReset();
return 0;
}
关于c++ - NVIDIA Visual profiler 不生成时间线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428003/
我正在尝试在 Google Colab 上运行 stylegan2,但在我的 Drive 上运行所有文件,并避免使用 !git clone 从 github of stylegan2 。 这是我在特定
我需要升级我的 nvidia 驱动程序,以便尝试运行 NVIDIA-LInux-x86_64.run文件 但是,我看到以下消息 ERROR: An NVIDIA kernel module 'nvid
我经历过Cuda programming guide但仍然不清楚 cuda 内核在 GPU 上的什么位置?换句话说,它驻留在哪个内存段? 另外,我怎么知道我的设备支持的最大内核大小是多少?最大内核大小
我想在基于官方nvidia/cuda的容器中运行带有cuvid硬件加速解码的ffmpeg图片。 Ffmpeg 无法找到 libnvcuvid.so,尽管有所有必需的 cuda 库。ldconfig -
当我运行命令 nvidia-smi ,我得到以下两个按总线 ID 排序的 GPU: For GPU 0, 00000000:0A:00.0 For GPU 1, 00000000:41:00.0 但是
我正在使用 Ubuntu 14.04 LTS 运行 AWS EC2 g2.2xlarge 实例。我想在训练 TensorFlow 模型时观察 GPU 利用率。我在尝试运行“nvidia-smi”时遇到
我尝试在安装 docker-ce 后安装 nvidia-docker。我关注的是:https://github.com/NVIDIA/nvidia-docker安装 nvidia-docker。看来已
我一直认为 Hyper-Q 技术不过是 GPU 中的流。后来我发现我错了(是吗?)。所以我读了一些关于 Hyper-Q 的书,却更加困惑了。 我正在浏览一篇文章,它有以下两个陈述: A. Hyper-
我刚刚在安装了两个 K20m GPU 的服务器中运行了 simpleMultiGPU。然后运行 nvidia-smi 命令来显示 GPU 的状态。结果如下: 问题如下: GPU 内存使用情况似乎不
NVIDIA-SMI 抛出此错误: NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make
如何使用 Vulkan 来利用 Nvidia 的张量核心(在计算着色器中?!)? Nvidia 有这篇文章 Programming Tensor Cores in CUDA 9 ,但这显然是针对 CU
我在类的一个项目中使用 Chapel,我正在尝试使用我的两个 Nvidia Jetson nano 板进行多语言环境执行。按照本教程 https://chapel-lang.org/docs/usin
我得到nvidia-smi得到Memory-Usage是这样的 $nvidia-smi -i 0,1 Wed Mar 4 16:20:07 2020 +-----------------
我得到nvidia-smi得到Memory-Usage是这样的 $nvidia-smi -i 0,1 Wed Mar 4 16:20:07 2020 +-----------------
有没有区别: nvidia-docker 运行 和 docker run --runtime=nvidia ? 在 official docs他们使用后者,但我在其他在线教程中看到过前者。 最佳答案
我有一个用 C 编写的代码(使用 opencl 规范)来列出所有可用的设备。我的 PC 安装了 AMD FirePro 和 Nvidia 的 Tesla 显卡。我先安装了AMD-APP-SDK-v3.
我读到可以使用内核启动来同步不同的 block ,即,如果我希望所有 block 在进行操作 2 之前完成操作 1,我应该将操作 1 放在一个内核中,将操作 2 放在另一个内核中。这样,我可以实现 b
我目前正在尝试使用函数 NvAPI_Stereo_SetDriverMode 将 nvapi 设置为在直接模式下工作。 根据 Nvidia nvapi site (在手册中),如果你想做一个 dire
我对nvidia GPU的任务调度有些疑惑。 (1)如果一个 block (CTA)中的线程束已经完成,但仍有其他线程在运行,这个线程会等待其他线程完成吗?换句话说,当所有线程都完成时, block
有人在Nvidia Tegra X1上使用了tensorflow吗? 我发现一些资料表明TK1上可能存在这种情况,或者TX1上存在严重的黑客入侵/错误,但尚无确定的配方。 http://cudamus
我是一名优秀的程序员,十分优秀!