我正在尝试从内核(即所谓的“动态并行性”)调用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 = cudaDeviceReset();
printf("%d\n", cudaStatus);
printf("{%d,%d,%d,%d,%d}\n", c[0], c[1], c[2], c[3], c[4]);
return 0;
}
如果我运行它,输出结果会像这样:
>nvcc -run kernel.cu -gencode=arch=compute_35,code=\"sm_35,compute_35\" -rdc=true -lcudadevrt
kernel.cu
Creating library a.lib and object a.exp
0
{0,0,0,0,0}
当我调用内存设置函数时,我使用值
0x7FFFFFFF
。我期望看到非零数值,但它总是显示为零。这是一个错误吗?还是我做错了什么?我正在使用CUDA 8.0。
cudaMemsetAsync
中的一个bug。我已在NVIDIA内部提交了一个bug。如果我有任何重要的发现,我会进行更新。在那之前,我的建议是使用另一种方法来初始化内存,比如使用代码循环。 - Robert Crovellamemset()
函数,并调用它,而不是使用API函数。或者,编写自己的内核并使用动态并行性启动它。如果我是你,我非常希望避免内核启动。 - einpoklum