小编Bea*_*amy的帖子

为什么CudaFree似乎没有释放内存?

我正在尝试分配设备内存,复制到它,在GPU上执行计算,将结果复制回来然后释放我分配的设备内存.我想确保我没有超出限制,我想看看我是否在共享内存空间中有足够的内存来转储一些数组.

当我分配设备内存时,不会返回任何错误.当我cudaMemGetInfo用来检查分配的内存量时,看起来好像cudaMalloc没有分配任何内存.此外,当我尝试释放内存时,看起来只有一个指针被释放.

我正在使用matlab Mexfunction接口来设置GPU内存并启动内核.此时,我甚至没有调用内核,只返回结果的单位矩阵.

cudaError_t cudaErr;
size_t freeMem = 0;
size_t totalMem = 0;
size_t allocMem = 0;
cudaMemGetInfo(&freeMem, &totalMem);  
mexPrintf("Memory avaliable: Free: %lu, Total: %lu\n",freeMem, totalMem);  

/* Pointers for the device memory */
double *devicePulseDelay, *deviceTarDistance, *deviceScattDistance, *deviceScatterers;
double *deviceReceivedReal, *deviceReceivedImag;

/* Allocate memory on the device for the arrays. */
mexPrintf("Allocating memory.\n");
cudaErr = cudaMalloc( (void **) &devicePulseDelay, sizeof(double)*512);
if (cudaErr != cudaSuccess)
{
    mexPrintf("could not allocate memory to devicePulseDelay\n");
    mexPrintf("Error: %s\n",cudaGetErrorString(cudaErr));
} …
Run Code Online (Sandbox Code Playgroud)

memory free cuda

8
推荐指数
1
解决办法
7507
查看次数

遇到cuda不可纠正的ECC错误

我的环境是

  • Windows 7 x64
  • Matlab 2012a x64
  • Cuda SDK 4.2
  • 特斯拉C2050 GPU

我无法弄清楚为什么我的GPU因遇到"无法纠正的ECC错误"而崩溃.仅当我使用512个或更多线程时才会发生此错误.我不能发布内核,但我会尝试描述它的作用.

通常,内核负责多个参数,并产生由所述螺纹的尺寸,M和其他数定义2个复杂matricies,N.,返回的矩阵将是大小为M×N的.典型配置为512x512,但每个数字都是独立的,可以向上或向下变化.当数字为256x256时,内核可以工作.

每个线程(内核)基于线程id(即大小为999xM)从2D阵列中提取999大小的向量,然后循环通过输出矩阵的行(0 ... N-1)进行计算.计算许多中间参数,仅使用+ - * /运算符中的pow,sin和cos .要计算其中一个输出矩阵,需要执行一个额外的循环来总结先前提取的999向量的贡献.此循环执行一些中间计算以确定允许贡献的值的范围.然后通过由计算的分数值的cos和正弦值确定的因子来缩放贡献.这是它崩溃的地方.如果我坚持使用常量值或1.0或任何其他值,内核执行没有问题.但是,当只包含一个调用(cos或sine)时,内核崩溃.

一些伪代码如下:

kernel()
{

/* Extract 999 vector from 2D array 999xM - one 999 vector for each thread. */
for (int i = 0; i < 999; i++)
{
    .....
}

/* Cycle through the 2nd dimension of the output matricies */
for (int j = 0; j < N; j++)
{
    /* Calculate some intermediate variables …
Run Code Online (Sandbox Code Playgroud)

crash cuda

5
推荐指数
1
解决办法
6139
查看次数

cuda理解并发内核执行

我试图了解并发内核执行的工作原理.我写了一个简单的程序来试图理解它.内核将使用2个流填充2D数组.当有1个流,没有并发时,我得到了正确的结果.当我尝试使用2个流,尝试并发时,我得到了错误的结果.我相信它与内存传输有关,因为我不太确定我是否正确或我设置内核的方式.编程指南对我来说不够好.出于我的目的,我需要Matlab来调用内核.

据我了解,主程序将:

  • 在主机上分配固定内存
  • 分配单个流所需的GPU内存(2个流=主机总内存的一半)
  • 创建流
  • 循环流
  • 使用cudaMemcpyAsync()将单个流的内存从主机复制到设备
  • 为流执行内核
  • 将流的内存复制回主机cudaMemcpyAsync()
    • 我相信我通过根据每个流的数据大小和流数量使用偏移量从每个流需要的位置引用内存来做正确的事情.
  • 摧毁溪流
  • 释放记忆

这是我试图使用的代码.

concurrentKernel.cpp

__global__ void concurrentKernel(int const width, 
                                  int const streamIdx,
                                  double *array)
 {
     int thread = (blockIdx.x * blockDim.x) + threadIdx.x;;

     for (int i = 0; i < width; i ++)
     {
        array[thread*width+i] = thread+i*width+1;
//         array[thread*width+i+streamIdx] = thread+i*width+streamIdx*width/2;
     }

 }
Run Code Online (Sandbox Code Playgroud)

concurrentMexFunction.cu

#include <stdio.h>
#include <math.h>
#include "mex.h"

/* Kernel function */
#include "concurrentKernel.cpp"


void mexFunction(int        nlhs,
                 mxArray    *plhs[],
                 int        nrhs,
                 mxArray    *prhs[])
{

    int const numberOfStreams = …
Run Code Online (Sandbox Code Playgroud)

concurrency cuda

5
推荐指数
1
解决办法
3827
查看次数

如何在mex结构中设置矢量元素

我正在尝试在mex函数中填充结构.我有在mexFunction中创建的结构的基础知识,但是当结构中的字段是一个数组并且我想在"for"循环迭代时填充此数组中的每个元素时,它会有点混乱.

....
mxArray *value;
mwSize dims[2] = {16,8};
int numFields = 2;  
const char *fieldNames[] = {"array1", "array2"}; 
plhs[2] = mxCreateStructArray(2, dims, numFields, fieldNames);

for (int i = 0; i < 16; i++)
{
    for (int j = 0; j < 8; j ++)
    {
        value1 = (some calculation);
        value = mxCreateDoubleMatrix(1,18,mxREAL); 
        *mxGetPr(value[sampleIndex]) = value1;
        mxSetField(plhs[2], i, "array1", value);
        // i want to set the array1[j] element

        value2 = (some other calculation);
        value = mxCreateDoubleMatrix(1,8,mxREAL); 
        *mxGetPr(value) = value2;
        mxSetField(plhs[2], i, …
Run Code Online (Sandbox Code Playgroud)

c arrays matlab structure mex

3
推荐指数
1
解决办法
1400
查看次数

如何使用Matlab的Nvidia Visual Profile对CUDA进行分析

我需要从Matlab中分析我的CUDA代码.我一直在将一些matlab代码转换为CUDA以提高性能.我通过调用调用CUDA的mexFunction来完成此操作.matlab feval函数不能提供足够的控制.我可以通过VS运行mexFunction来调试它,但我也需要调试内核,因为我相信这是问题所在.

所以,我的问题是在执行调用它的matlab函数时如何通过分析器运行CUDA代码?

将所有输入的值硬编码到CUDA函数中是不切实际的.

我在Windows 7 64bit上使用Tesla C2050 GPU卡运行Matlab 2012a 64bit

profiler matlab cuda

3
推荐指数
1
解决办法
2461
查看次数

cuda线程和块

我在NVIDIA论坛上发布了这个,我想我会多点帮忙.

我在尝试扩展我的代码以执行多个案例时遇到了麻烦.我一直在开发最常见的案例,现在是测试时间,我需要确保它适用于不同的情况.目前我的内核是在一个循环中执行的(有原因我们没有做一个内核调用来完成整个事情.)来计算矩阵行的值.最常见的情况是512列乘512行.我需要考虑尺寸为512 x 512,1024 x 512,512 x 1024和其他组合的基质,但最大的将是1024 x 1024矩阵.我一直在使用一个相当简单的内核调用:

launchKernel<<<1,512>>>(................)
Run Code Online (Sandbox Code Playgroud)

这个内核适用于常见的512x512和512 x 1024(分别为列,行)情况,但不适用于1024 x 512的情况.这种情况需要1024个线程才能执行.在我天真的时候,我一直在尝试不同版本的简单内核调用来启动1024个线程.

launchKernel<<<2,512>>>(................)  // 2 blocks with 512 threads each ???
launchKernel<<<1,1024>>>(................) // 1 block with 1024 threads ???
Run Code Online (Sandbox Code Playgroud)

我相信我的问题与我对线程和块的缺乏理解有关

这是deviceQuery的输出,你可以看到我最多可以有1024个线程

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.1\C\bin\win64\Release\deviceQuery.exe Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Found 2 CUDA Capable device(s)

Device 0: "Tesla C2050"
  CUDA Driver Version / Runtime Version          4.2 / 4.1
  CUDA Capability Major/Minor version number:    2.0
  Total amount of global memory: …
Run Code Online (Sandbox Code Playgroud)

cuda

0
推荐指数
1
解决办法
3981
查看次数

标签 统计

cuda ×5

matlab ×2

arrays ×1

c ×1

concurrency ×1

crash ×1

free ×1

memory ×1

mex ×1

profiler ×1

structure ×1