首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库达矩阵加集断层

库达矩阵加集断层
EN

Stack Overflow用户
提问于 2011-12-07 19:57:02
回答 2查看 1.6K关注 0票数 2

我只是对我写的库达程序有个问题。它允许我输入矩阵的大小,col和行。假设我输入了~1124,它计算得很好。但是,假设我输入了1149,在设备中计算后,它会捕获错误(我认为它在复制过程中发生了Seg故障)。但是假设我输入了2000,它在设备中计算之前就会产生故障(我认为它在复制过程中会产生故障)。我想我的问题都是内存管理。如果你们能给我指明正确的方向我会很感激的。

我用调用它的方式编辑了代码。在新的编辑(底部)中,包含:sumMatrix( eleCount1大小的空白矩阵,即整个矩阵的大小)、matrixOne(第一矩阵)、matrixTwo(第二矩阵,分配相同的matrix1方法)、eleCount1(整个矩阵的大小)。matrixOne和两个都是从文件中读取的。

我不确定是否有人需要看我的GPU的这些东西:

  • 固定内存总量: 65536字节
  • 每个块共享内存总量: 49152字节
  • 每个块可用寄存器总数:32768
  • 翘曲大小:32
  • 翘曲大小:32

<代码>H 19每个块的最大线程数: 1024 <代码>H 210<代码>H 111块的每个维度的最大大小:1024x1024x64<代码>H 212<代码>H 113网格中每个维度的最大大小: 65535 x 65535 x 65535H 214F 215

守则是:

代码语言:javascript
复制
void addKernel(float *c, float *a, float *b)
{
    int i = threadIdx.x;
    int idx = blockDim.x * blockIdx.x + threadIdx.x;
    c[idx] = a[idx] + b[idx];
}
cudaError_t addWithCuda(float *c, float *a, float *b, size_t size)
{
  float *dev_a = 0;
  float *dev_b = 0;
  float *dev_c = 0;
  cudaError_t cudaStatus;
  blocksNeeded=(size/MAXTHREADS)+1;
  int threadsPerBlock = MAXTHREADS/blocksNeeded+1;
  cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(float));
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMalloc failed!");
      goto Error;
  }

  cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(float));
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMalloc failed!");
      goto Error;
  }

  cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(float));
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMalloc failed!");
      goto Error;
  }

  cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(float), cudaMemcpyHostToDevice);
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMemcpy failed!");
      goto Error;
  }

  cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(float), cudaMemcpyHostToDevice);
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMemcpy failed!");
      goto Error;
  }

  addKernel<<<blocksNeeded, size>>>(dev_c, dev_a, dev_b);
  cudaStatus = cudaDeviceSynchronize();

  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
      goto Error;
  }
  cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(float), cudaMemcpyDeviceToHost);
  if (cudaStatus != cudaSuccess) {
      fprintf(stderr, "cudaMemcpy failed!");
      goto Error;
  }

Error:
  cudaFree(dev_c);
  cudaFree(dev_a);
  cudaFree(dev_b);

  return cudaStatus;
}
//edit: added how the matrix are allocated
    float* matrixOne = (float*)malloc(sizeof(float)*file1size);
int matrixIndex = 0;
readFromFile(fd,byte, matrixOneWidth, matrixOneHeight,  matrixOne);

//matrixOneHeight--;
eleCount1 = matrixOneHeight*matrixOneWidth;
matrixOne= (float*)realloc(matrixOne,eleCount1*sizeof(float));
//Edit: Added how the addWithCuda is called.
cudaStatus = addWithCuda(sumMatrix, matrixOne,matrixTwo,eleCount1);
//sumMatrix is created after we know how large the matrices are. 
float sumMatrix[eleCount1];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-07 20:03:04

您并不是在测试内核中计算的界限。如果总工作量不均匀地分配到块的大小,一些线程将尝试写入输出数组之外的索引。我建议您也将大小作为参数传递给内核,并引入检查:

代码语言:javascript
复制
__global__ void addKernel(float *c, float *a, float *b, int size)
{
    int i = threadIdx.x;
    int idx = blockDim.x * blockIdx.x + threadIdx.x;
    if(idx < size) c[idx] = a[idx] + b[idx];
}
票数 0
EN

Stack Overflow用户

发布于 2011-12-07 20:04:09

我看到您正在为内核中的数组a、b和c建立索引,但是您没有检查索引是否在数组边界内。因此,您正在将不属于自己的内存写入内存中,从而在随机位置造成seg错误。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8421678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档