我正在开发一个 CUDA 内核来计算图像的直方图(NVIDIA GTX 480)。我注意到使用 cuda profiler 发现了 82.2% 的分支分歧。分析器将以下函数指示为差异源,该函数位于名为device_functions.h的文件中(特别是包含 return 语句的行)。
static __forceinline__
unsigned int __uAtomicAdd(unsigned int *p, unsigned int val)
{
return __nvvm_atom_add_gen_i((volatile int *)p, (int)val);
}
Run Code Online (Sandbox Code Playgroud)
原子操作导致分支发散的说法正确吗?
Maxwell Architecture 在 PTX 汇编中引入了一条新指令,称为 LOP3,根据NVIDIA 博客:
“在对多个输入执行复杂逻辑运算时可以保存指令。”
在GTC 2016 上,一些 CUDA 开发人员设法使用此类指令加速了Tegra X1 处理器(Maxwell)的atan2f功能。
但是,下面的函数中定义的.cu文件导致未定义的定义__SET_LT和__LOP3_0xe2。
我是否必须在.ptx文件中定义它们?如果是这样,如何?
float atan2f(const float dy, const float dx)
{
float flag, z = 0.0f;
__SET_LT(flag, fabsf(dy), fabsf(dx));
uint32_t m, t1 = 0x80000000;
float t2 = float(M_PI) / 2.0f;
__LOP3_0x2e(m, __float_as_int(dx), t1, __float_as_int(t2));
float w = flag * __int_as_float(m) + float(M_PI)/2.0f;
float Offset = copysignf(w, dy);
float t = fminf(fabsf(dx), fabsf(dy)) …Run Code Online (Sandbox Code Playgroud) 我尝试将开放资产导入库(读取各种 3D 模型文件类型)的多功能性与 NVidia Optix 光线追踪相结合来渲染模型。
到目前为止,只要我渲染的模型由单个网格组成,它就可以工作。当我尝试渲染具有多个网格的文件时,我只得到部分结果。我无法缩小问题所在,寻找一些见解。相关代码在这里:
使用 assimp 导入器加载文件并创建 optix 缓冲区:
int loadAsset(const char* path)
{
Assimp::Importer importer;
scene = importer.ReadFile(
path,
aiProcess_Triangulate
//| aiProcess_JoinIdenticalVertices
| aiProcess_SortByPType
| aiProcess_ValidateDataStructure
| aiProcess_SplitLargeMeshes
| aiProcess_FixInfacingNormals
);
if (scene) {
getBoundingBox(&scene_min, &scene_max);
scene_center.x = (scene_min.x + scene_max.x) / 2.0f;
scene_center.y = (scene_min.y + scene_max.y) / 2.0f;
scene_center.z = (scene_min.z + scene_max.z) / 2.0f;
float3 optixMin = { scene_min.x, scene_min.y, scene_min.z };
float3 optixMax = { scene_max.x, scene_max.y, scene_max.z };
aabb.set(optixMin, optixMax);
unsigned …Run Code Online (Sandbox Code Playgroud) 有两次,当我使用 4x1080ti 完成训练模型时,服务器宕机了。服务器为什么会崩溃?
我得到 sysylog 并发现 Nvidia 驱动程序或 GPU 有问题。
系统日志:(和nvidia-bug-report.log)
[第二个]
9 月 6 日 21:11:41 gpu-8-server-intesight 内核:[31429.221258] NVRM:RmInitAdapter 失败!(0x30:0xffff:682)
9 月 6 日 21:11:41 gpu-8-server-intesight 内核:[31429.221337] NVRM:rm_init_adapter 设备承载次要编号 0 失败
9 月 6 日 21:13:54 gpu-8-server-intesight 内核:[31562.154256] NVRM:RmInitAdapter 失败!(0x30:0xffff:682)
9 月 6 日 21:13:54 gpu-8-server-intesight 内核:[31562.154306] NVRM:rm_init_adapter 失败,设备承载次要编号 1
[第一个]
9 月 6 日 02:48:40 gpu-8-server-intesight 内核:[557998.990374] NVRM:PCI 上的 GPU:0000:04:00:GPU-bc54db68-a3cb-54e9-7287-b95c69e41cf1
9 月 6 日 02:48:40 gpu-8-server-intesight 内核:[557998.990375] NVRM:GPU 板序列号:
9 月 6 日 02:48:40 gpu-8-server-intesight 内核:[557998.990376] …
我正在尝试将 a 中的数据复制cv::cuda::GpuMat到uint8_t*要在内核中使用的变量。
GpuMat 包含分辨率为 752x480 且类型为 CV_8UC1 的图像数据。下面是示例代码:
uint8_t *imgPtr;
cv::Mat left, downloadedLeft;
cv::cuda::GpuMat gpuLeft;
left = imread("leftview.jpg", cv::IMREAD_GRAYSCALE);
gpuLeft.upload(left);
cudaMalloc((void **)&imgPtr, sizeof(uint8_t)*gpuLeft.rows*gpuLeft.cols);
cudaMemcpyAsync(imgPtr, gpuLeft.ptr<uint8_t>(), sizeof(uint8_t)*gpuLeft.rows*gpuLeft.cols, cudaMemcpyDeviceToDevice);
// following code is just for testing and visualization...
cv::cuda::GpuMat gpuImg(left.rows, left.cols, left.type(), imgPtr);
gpuImg.download(downloadedLeft);
imshow ("test", downloadedLeft);
waitKey(0);
Run Code Online (Sandbox Code Playgroud)
但输出并不如预期。以下分别是输入和输出图像。
我已经尝试将cv::Mat源提供给cudaMemcpy. 看起来运行良好。问题似乎与cv::cuda::GpuMat和有关cudaMemcpy。这里讨论了类似的问题
另外,如果图像是 256 或 512,则程序似乎运行良好。
我缺少什么?应该怎样做才能使 752x480 图像正常工作?
我有一台带有 nvidia 显卡的服务器,我想运行一些 openGL 应用程序并将显示内容 xforwarding 到客户端。
我怎样才能做到这一点?目前我还没有安装 X 窗口系统。
我为这个问题搜索了一个月。我无法同步 CUDA 中的块。
我读过很多关于atomicAdd、合作组等的文章。我决定使用一个全局数组,这样一个块就可以在全局数组的一个元素上写入。写入之后,块的线程将等待(即陷入 while 循环),直到所有块都写入全局数组。
当我使用 3 个块时,我的同步效果很好(因为我有 3 个 SM)。但使用 3 个街区可以让我获得 12% 的入住率。所以我需要使用更多的块,但它们无法同步。问题是:SM 上的一个块等待其他块,因此 SM 无法获取另一个块。
我能做些什么?当区块数量超过SM数量时,如何同步区块?
CUDA-GPU 规范:CC。6.1、3 SM、Windows 10、VS2015、GeForce MX150 显卡。请帮助我解决这个问题。我使用了很多代码,但没有一个起作用。
我有一个 CUDA 程序,其中一个经线需要访问(例如)96 字节的全局内存。
它正确对齐内存位置和通道索引,以便在单个事务中合并并完成访问。
该程序可以使用 12 个通道进行访问,每个通道访问一个 uint8_t。或者,它将使用 6 个通道访问 uint16_t,或使用 3 个通道访问 uint32_t。
这些替代方案之间是否存在性能差异,如果每个线程访问较少量的内存,访问速度是否更快?
当每个 warp 需要访问的内存量不同时,优化它是否有好处,以便线程在可能的情况下访问更小的单元(16 位或 8 位)?
我正在尝试使用 gpu 在 tensorflow 上运行我的代码 Keras CuDNNGRU,但即使我已经安装了 CUDA 和 CuDNN,它也总是出现错误“找不到 dnn 实现”。
我已经多次重新安装 CUDA 和 CuDNN,并将 CuDNN 版本从 7.2.1 升级到 7.5.0,但它没有解决任何问题。我还尝试在 Jupyter Notebook 和 python 编译器(在终端上)运行我的代码,并且两个结果是相同的。这是我的硬件和软件的详细信息。
这是我的代码。
encoder_LSTM = tf.keras.layers.CuDNNGRU(hidden_unit,return_sequences=True,return_state=True)
encoder_LSTM_rev=tf.keras.layers.CuDNNGRU(hidden_unit,return_state=True,return_sequences=True,go_backwards=True)
encoder_outputs, state_h = encoder_LSTM(x)
encoder_outputsR, state_hR = encoder_LSTM_rev(x)
Run Code Online (Sandbox Code Playgroud)
这是错误信息。
2019-05-27 19:08:06.814896: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0
2019-05-27 19:08:06.814956: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge …Run Code Online (Sandbox Code Playgroud) Nvidia GTX 1050 4GB GPU 可以启动多少个线程?例如:内核<<<1,32>>>(args); 可以启动 32 个线程。那么可能的最大线程数是多少?我知道这篇文章nvidia GTS 450 有多少线程