我换了一个新的 GPU GeForce GTX 980 cc 5.2,所以它必须支持动态并行。但是,我什至无法编译一个简单的代码(来自编程指南)。我不会在这里提供它(没有必要,只是有一个全局内核调用另一个全局内核)。
1)我使用VS2013进行编码。在 中property pages -> CUDA C/C++ -> device,我将code generation属性更改为compute_35,sm_35,这是输出:
1>------ Build started: Project: testCublas3, Configuration: Debug Win32 ------
1> Compiling CUDA source file kernel.cu...
1>
1> C:\programs\misha\cuda\Projects\test projects\testCublas3\testCublas3>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS …Run Code Online (Sandbox Code Playgroud) 我试图cudaMemsetAsync从内核调用(所谓的"动态并行").但无论我使用什么值,它总是将内存设置为0.
这是我的测试代码:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "cuda_device_runtime_api.h"
#include <stdio.h>
const int size = 5;
__global__ void kernel(int *c)
{
cudaMemsetAsync(c, 0x7FFFFFFF, size * 4, NULL);
}
int main()
{
cudaError_t cudaStatus;
int c[size] = { 12, 12, 12, 12, 12 };
int *dev_c = 0;
cudaStatus = cudaSetDevice(0);
cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
cudaStatus = cudaMemcpy(dev_c, c, size * sizeof(int), cudaMemcpyHostToDevice);
kernel <<< 1, 1 >>>(dev_c);
cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
cudaFree(dev_c);
cudaStatus …Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的问题,但我无法找到对此主题的任何引用:如何从另一个内核中启动内核?.我遇到的唯一相关示例是帖子:( Alea GPU是否支持动态并行?),它在C#中提供了一个示例.
鉴于F#使用Code Quotation,我假设有一种直接的方法来执行我无法找到的操作.
请告知,或指向相关资源.任何帮助将不胜感激.
问候.
使用CUDA Dynamic Parallelism时,我们遇到了性能问题.目前,CDP的表现比传统方法慢至少3倍.我们制作了最简单的可重现代码来显示这个问题,即将数组的所有元素的值增加+1.即
a[0,0,0,0,0,0,0,.....,0] --> kernel +1 --> a[1,1,1,1,1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)
这个简单示例的目的只是为了查看CDP是否可以像其他CDP一样执行,或者是否存在严重的开销.
代码在这里:
#include <stdio.h>
#include <cuda.h>
#define BLOCKSIZE 512
__global__ void kernel_parent(int *a, int n, int N);
__global__ void kernel_simple(int *a, int n, int N, int offset);
// N is the total array size
// n is the worksize for a kernel (one third of N)
__global__ void kernel_parent(int *a, int n, int N){
cudaStream_t s1, s2;
cudaStreamCreateWithFlags(&s1, cudaStreamNonBlocking);
cudaStreamCreateWithFlags(&s2, cudaStreamNonBlocking);
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if(tid == …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译和链接动态内核,并将其与GK110 上的CUDA 驱动程序 API一起使用。
我在 Visual Studio 中使用可重定位设备代码标志和compute_35、sm_35 编译 .cu 源文件到 ptx 文件中,然后CUDA 链接器添加 cudadevrt.lib(至少它尝试根据链接器调用)。当我在 ptx .obj 上执行 cuModuleLoad 时,它显示不支持的设备代码。还有一个.device-link.obj看起来小得不切实际,并且驱动程序 api 函数似乎都没有将其识别为有效图像。在检查 ptx 文件时,我可以看到它根据 CUDA 文档(PTX 部分的动态并行性)生成了对内核启动函数的调用。
如何链接正确的设备代码以使动态内核调用起作用?
(这是Win64上的CUDA 6.5和VC2013)