Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cuda不能运行超过1024*255个线程_C++_Cuda_Thrust - Fatal编程技术网

C++ Cuda不能运行超过1024*255个线程

C++ Cuda不能运行超过1024*255个线程,c++,cuda,thrust,C++,Cuda,Thrust,我在亚马逊的K520 GPU上运行,有1500个内核和4GB内存。我正在尝试运行一个1024*850线程的内核。我知道每个块最多只能获得1024个线程,但当我不能使用每个块1024个线程来启动超过255个块时,我感到惊讶(我得到了一个启动错误)。我认为网格大小的限制是2^16。不过,当我运行一个空内核时,它可以很好地运行。这让我觉得某处没有足够的记忆。我想知道我是否能得到一个关于正在发生的事情的解释。谢谢以下是内核: __global__ void dotSubCentroidNorm ( P

我在亚马逊的K520 GPU上运行,有1500个内核和4GB内存。我正在尝试运行一个1024*850线程的内核。我知道每个块最多只能获得1024个线程,但当我不能使用每个块1024个线程来启动超过255个块时,我感到惊讶(我得到了一个启动错误)。我认为网格大小的限制是2^16。不过,当我运行一个空内核时,它可以很好地运行。这让我觉得某处没有足够的记忆。我想知道我是否能得到一个关于正在发生的事情的解释。谢谢以下是内核:

__global__ void dotSubCentroidNorm
(
 Pt* segments,
 int pointCount,
 const Pt* centroids,
 const int* segmentChanges,
 float *dotResult
 )
{

  int idx = index();
  if(idx>=pointCount)
    return;
  int segment = segments[idx].segmentIndex;
  if(segment<0)
    return;
  int segPtCount = segmentChanges[segment+1]-segmentChanges[segment];
  Pt &pt = segments[idx];
  if(segPtCount==0)
  {
    printf("segment pt count =0 %d %d\n",idx, segment);
    return;
  }
  const Pt &ctr = centroids[segment];
  pt.x=pt.x-ctr.x/segPtCount;
  pt.y=pt.y-ctr.y/segPtCount;
  pt.z=pt.z-ctr.z/segPtCount;

  dotResult[idx] = pt.x*pt.x;
  dotResult[pointCount + idx] = pt.x*pt.y;
  dotResult[pointCount*2 + idx] = pt.x*pt.z;
  dotResult[pointCount*3 + idx] = pt.y*pt.y;
  dotResult[pointCount*4 + idx] = pt.y*pt.z;
  dotResult[pointCount*5 + idx] = pt.z*pt.z;
}
我用一个数组来调用这个内核,其中大约400000 Pt用于分段,200 Pt用于质心,200 Pt用于分段更改,400000*6用于dotResult。电话如下:

....
thrust::device_vector<float> dotResult(pointCount*6);

printf("Errors1: %s \n",cudaGetErrorString(cudaGetLastError()));

int tpb = 1024; //threads per block
dim3 blocks = blkCnt(pointCount, tpb);
printf("blocks: %d %d\n", blocks.x, blocks.y);
dotSubCentroidNorm<<<blocks ,tpb>>>
  (
   segments,
   pointCount,
   thrust::raw_pointer_cast(centroids.data()),
   segmentChanges,
   thrust::raw_pointer_cast(dotResult.data())
  );
printf("Errors2: %s \n",cudaGetErrorString(cudaGetLastError()));
cudaThreadSynchronize();

printf("Errors3: %s \n",cudaGetErrorString(cudaGetLastError()));
....

 #define blkCnt(size, threadsPerBlock) dim3(min(255,(int)floor(1+(size)/(threadsPerBlock))),floor(1+(size)/(threadsPerBlock)/256))
#define index() (threadIdx.x + (((gridDim.x * blockIdx.y) + blockIdx.x)*blockDim.x))
....
。。。。
推力:设备矢量点结果(点计数*6);
printf(“错误1:%s\n”,cudaGetErrorString(cudaGetLastError());
int-tpb=1024//每个块的线程数
dim3块=blkCnt(点计数,tpb);
printf(“块:%d%d\n”,块.x,块.y);
点亚中心虫
(
部分,
点数,
推力::原始指针投影(质心.data()),
分段更改,
推力::原始指针强制转换(dotResult.data())
);
printf(“Errors2:%s\n”,cudaGetErrorString(cudaGetLastError());
cudaThreadSynchronize();
printf(“错误3:%s\n”,cudaGetErrorString(cudaGetLastError());
....
#定义blkCnt(尺寸,螺纹锁紧)dim3(最小(255,(内部)地板(1+(尺寸)/(螺纹锁紧))),地板(1+(尺寸)/(螺纹锁紧)/256))
#定义索引()
....

显然,我是在为“segmentChanges”而不是设备传递主机数组,这就是为什么它会崩溃。

问题是什么?为什么我在启动此内核的1024*255个线程时会出错?最好提供一个简短、完整的代码,让其他人可以复制、编译和运行。是的,这需要你做一些工作,但它能提供更有效的帮助。您收到的确切错误消息是什么?
点计数的值是多少?(是的,您提供了一组数字,我无法判断其中哪一个是真正的
pointCount
。一个完整的代码会让它变得很明显。)使用
cuda memcheck
运行代码时会发生什么?
....
thrust::device_vector<float> dotResult(pointCount*6);

printf("Errors1: %s \n",cudaGetErrorString(cudaGetLastError()));

int tpb = 1024; //threads per block
dim3 blocks = blkCnt(pointCount, tpb);
printf("blocks: %d %d\n", blocks.x, blocks.y);
dotSubCentroidNorm<<<blocks ,tpb>>>
  (
   segments,
   pointCount,
   thrust::raw_pointer_cast(centroids.data()),
   segmentChanges,
   thrust::raw_pointer_cast(dotResult.data())
  );
printf("Errors2: %s \n",cudaGetErrorString(cudaGetLastError()));
cudaThreadSynchronize();

printf("Errors3: %s \n",cudaGetErrorString(cudaGetLastError()));
....

 #define blkCnt(size, threadsPerBlock) dim3(min(255,(int)floor(1+(size)/(threadsPerBlock))),floor(1+(size)/(threadsPerBlock)/256))
#define index() (threadIdx.x + (((gridDim.x * blockIdx.y) + blockIdx.x)*blockDim.x))
....