簡體   English   中英

為什么我的CUDA內核返回舊值?

[英]Why is my CUDA kernel returning old values?

幾乎就是在這個問題上撕掉我的頭發。

我有一個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的Visual Studio 2010(CUDA 7.0)。 我在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM