关于 CUDA 10.1
我正在对几何网格进行一些计算,并在网格的每个面进行大量独立计算。我运行一个 CUDA 内核来计算每个面。
计算涉及一些矩阵乘法,因此我想使用 cuBLAS 或 cuBLASLt 来加快速度。由于我需要进行许多矩阵乘法(至少每个面几次),我想直接在内核中进行。这可能吗?
cuBLAS 或 cuBLASLt 似乎不允许您从内核(__global__)代码调用它们的函数。我从 Visual Studio 收到以下错误:
“不允许从 __device__ 函数调用 __host__ 函数”
有一些旧答案(CUDA 内核可以调用 cublas 函数吗? https://stackoverflow.com/questions/13371082/could-a-cuda-kernel-call-a-cublas-function)这意味着这是可能的?
基本上,我想要一个像这样的内核:
__global__
void calcPerFace(...)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < faceCount; i += stride)
{
// Calculate some matrices for each face in the mesh
...
// Multiply those matrices
cublasLtMatmul(...) // <- not allowed by cuBLASLt
// Continue calculation
...
}
}
是否可以从 CUDA 10.1 中这样的内核调用 cublasLtMatmul 或 cublassgemm ?
这不可能
从 CUDA 10.0 开始,CUDA 不再支持从设备代码调用 CUBLAS 例程的功能。
A 弃用通知 https://docs.nvidia.com/cuda/archive/9.2/cuda-toolkit-release-notes/index.html#deprecated-features在 CUDA 10.0 之前给出,正式公告位于CUDA 10.0 发行说明 https://docs.nvidia.com/cuda/archive/10.0/cuda-toolkit-release-notes/index.html#deprecated-features:
从 CUDA 10.0 开始,删除了 cuBLAS 库,以支持从设备例程 (cublas_device) 中调用相同 cuBLAS API 的功能。
同样,依赖于此功能的 CUDA 示例代码,例如simpleDevLibCUBLAS
从 CUDA 10.0 开始,不再是 CUDA 工具包发行版的一部分。
这仅适用于 CUBLAS,并不意味着 CUDA 动态并行性的一般功能已被删除。
我将无法回答“为什么?”的问题。或者是“为什么?”的变体我将无法回答有关未来事件或主题的问题。没有任何技术原因导致此功能无法使用或不受支持。变化的原因与发展和资源优先级有关。我无法比这更深入了。如果您希望看到 CUDA 行为的变化,无论是功能、性能还是文档方面的变化,我们鼓励您通过在以下地址提交错误来表达您的愿望:http://developer.nvidia.com http://developer.nvidia.com。具体的错误提交说明已链接here https://devtalk.nvidia.com/default/topic/1044668/cuda-programming-and-performance/-how-to-report-a-bug/.
对于执行一些准备工作,然后调用 CUBLAS,然后执行一些其他工作的 CUDA 设备代码,一般建议是将其分解为执行准备工作的内核,然后从主机启动所需的 CUBLAS 例程,然后执行后续内核中的剩余工作。这并不意味着数据必须在设备和主机之间来回移动。当执行多个 CUBLAS 调用(例如每个设备线程)时,研究可用的各种 CUBLAS 批处理功能可能会有所帮助。不可能给出一个单一的方法来重构每种类型的代码。这些建议可能无法解决所有情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)