我正在尝试分配设备内存,复制到它,在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) 我的环境是
我无法弄清楚为什么我的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) 我试图了解并发内核执行的工作原理.我写了一个简单的程序来试图理解它.内核将使用2个流填充2D数组.当有1个流,没有并发时,我得到了正确的结果.当我尝试使用2个流,尝试并发时,我得到了错误的结果.我相信它与内存传输有关,因为我不太确定我是否正确或我设置内核的方式.编程指南对我来说不够好.出于我的目的,我需要Matlab来调用内核.
据我了解,主程序将:
这是我试图使用的代码.
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) 我正在尝试在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) 我需要从Matlab中分析我的CUDA代码.我一直在将一些matlab代码转换为CUDA以提高性能.我通过调用调用CUDA的mexFunction来完成此操作.matlab feval函数不能提供足够的控制.我可以通过VS运行mexFunction来调试它,但我也需要调试内核,因为我相信这是问题所在.
所以,我的问题是在执行调用它的matlab函数时如何通过分析器运行CUDA代码?
将所有输入的值硬编码到CUDA函数中是不切实际的.
我在Windows 7 64bit上使用Tesla C2050 GPU卡运行Matlab 2012a 64bit
我在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)