c++ - 为什么我的 CUDA 内核返回旧值?

标签 c++ c cuda

我几乎要为这个问题大发雷霆。

我有一个 CUDA 内核,它对存储在 3D 数组中的数据进行一些数学运算。在对此进行测试时,我曾经为数组分配一些值(非零)并观察结果。从那以后,我注释掉了这些行,但结果还是一样。就好像它完全忽略了我正在将 memset 设置为 0 的事实。

当我在 Debug 中逐步执行代码时,代码可以正常工作...但在 Release 中却不行! 我的猜测是这个矩阵发生了内存泄漏。

我将这个数组分配为:

cudaExtent m_extent = make_cudaExtent(sizeof(float)*matdim.x, matdim.y, matdim.z); // width, height, depth
cudaPitchedPtr m_device;
cudaMalloc3D(&m_device, m_extent);
cudaMemset3D(m_device, 0, m_extent);

我在这样的循环中调用内核:

for (int iter = 0; iter < gpu_iterations; iter++)
    {
        PF_iteration_kernel<<<grids,threads>>>(m_device, m_extent, matdim);
        cudaDeviceSynchronize(); 
    }

之后我释放了 m_device 倾斜指针:

cudaFree(m_device.ptr);

matdim 只是 dim3 持有的矩阵维度。

在内核中,我执行以下操作(好吧,我注释掉了所有功能......):

__global__ void PF_iteration_kernel(cudaPitchedPtr mPtr, cudaExtent mExt, dim3 matrix_dimensions)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;

// Find location within the pitched memory
char *m = (char*)mPtr.ptr;

int sof = sizeof(float);
size_t pitch = mPtr.pitch;
size_t slice_pitch = pitch*mExt.height;
char* m_addroff = m + y * pitch + x * sof;
printf("m(%d,%d) is %f \n", x, y, *m_addroff); // display the slice

*m_addroff = 0; // WILL THIS RESET IT?!

__syncthreads();
}

那应该只显示 0,但它显示我的旧值(25、26、27、28 等)。

我已经多次清理、重新清理和重建一切。我已经重新启动了 IDE。

我的 IDE 是带有 NSight 4.6 (CUDA 7.0) 的 Visual Studio 2010。 我在 Windows 7 x64 上

最佳答案

考虑一下

char* m_addroff = m + y * pitch + x * sof;
printf("m(%d,%d) is %f \n", x, y, *m_addroff);

编译器将看到 char 并将其提升为 int 并压入堆栈 - 而不是 float 提升为 double 格式要求。

编译器不提供符合格式规范的参数,但一些编译器会检查格式规范并发出问题警告。

我建议你提出论点。我冒着猜测和失败的风险,但是像这样的事情

printf("m(%d,%d) is %f \n", x, y, *(float*)m_addroff);

Herer 是一个简单的例子。

#include <stdio.h>
int main()
{
    char car [4] = {0};
    char *cptr = car;
    printf ("Hello %f\n", *(float*)cptr);
    return 0;
}

关于c++ - 为什么我的 CUDA 内核返回旧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854913/

相关文章:

c++ - 当您在设备内部调用 cudaMalloc 时实际发生了什么?

c++ - 如何将json对象转换为QObject?

c++ - 视频序列的运动估计

C 程序将错误的输出打印到文件

c - 数组中的负索引

c++ - 命名空间 thrust::system::cuda::thrust 中无法解释的错误,特别是在 "system_error"和 "cuda_category"

c++ - boost::shared_mutex vs boost::mutex 用于多线程写入?

c++ - 使用 C++11 shared_ptr 错误的 Eclipse 多态性

c - 如何在C中实现算术右移

cuda - 这篇 Parallel Forall 博文的代码中是否存在竞争条件?