`

CUDA程序block和thread超出硬件允许值时的异常

阅读更多
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。


以下程序在K5000GPU上跑的。
奇怪的是cuda samples中的deviceQuery程序给出的block大小的第一维可以到2^31,但实测还是只有655535!!!
#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>
#include <string>
#include <sstream>
#include <random>


cudaDeviceProp getCudaDeviceProperties(int deviceIdx = 0) {
	cudaSetDevice(deviceIdx);
	cudaDeviceProp deviceProp;
	cudaGetDeviceProperties(&deviceProp, deviceIdx);
	return deviceProp;
}




///在GPU上跑的函数,被称为kernel function
__global__ void productArray_bt_kernel(float *pa, float *pb, float *pResult, int N) {
	int idx = blockDim.x * blockIdx.x + threadIdx.x;
	if (idx < N)
		pResult[idx] = pa[idx] * pb[idx];
}

///kernel function 的辅助函数,用于自动分配内存、验证结果等;此处将内存的分配、拷贝放在了外部!因为同一参数要执行好多次
void productArray_bt(float *pa, float *pb, float *pResult, int N, int threadNum = 32) throw(std::string) {
	cudaError_t cudaStatus;
	int blockNum = (N - 1) / threadNum + 1;
	dim3 bd(blockNum, 1, 1);
	productArray_bt_kernel << <blockNum, threadNum >> > (pa, pb, pResult, N);
	// Check for any errors launching the kernel
	cudaStatus = cudaGetLastError();

	if (cudaStatus != cudaSuccess) {
		std::stringstream ss;
		ss << "productArray_bt_kernel launch failed: " << cudaGetErrorString(cudaStatus) << "\n\tblockNum=" << blockNum << ";\tthreadNum=" << threadNum << ";\t";
		std::string errStr = ss.str();
		//std::cerr << errStr << std::endl;
		throw errStr;
	}
	// cudaDeviceSynchronize waits for the kernel to finish, and returns
	// any errors encountered during the launch.
	cudaStatus = cudaDeviceSynchronize();
	if (cudaStatus != cudaSuccess) {
		std::stringstream ss;
		ss << "cudaDeviceSynchronize returned error code" << cudaStatus << "after launching addKernel!" << "\n\tblockNum=" << blockNum << ";\tthreadNum=" << threadNum << ";\t";
		std::string errStr = ss.str();
		//std::cerr <<errStr<< std::endl;
		throw errStr;
	}
}


void TestProductSpeed() {
	float *pa, *pb, *pResult;			// host copies
	float *d_a, *d_b, *d_c;	// device copies

	int N = 5;



	for (N = 1; N <= (1 << 20); N *= 2) {
		std::cout << "\n\n**************数组长度为  " << N << "  的测试\n";
		int size = sizeof (float)* N;


		// Allocate space for device copies of pa, pb, pResult
		cudaMalloc((void **)&d_a, size);
		cudaMalloc((void **)&d_b, size);
		cudaMalloc((void **)&d_c, size);


		pa = new float[N];
		pb = new float[N];
		pResult = new float[N];
		for (int i = 0; i < N; ++i) {
			pa[i] = i;
			pb[i] = i * 10;
		}



		// Copy inputs to device
		cudaMemcpy(d_a, pa, size, cudaMemcpyHostToDevice);
		cudaMemcpy(d_b, pb, size, cudaMemcpyHostToDevice);

		//std::cout << "blockDim.x=" << blockDim.x<<std::endl;
		// Launch add() kernel on GPU

		for (int threadNum = 1; threadNum <= 4096; threadNum *= 4) {
			try{
				cudaEvent_t start, stop;
				cudaEventCreate(&start);
				cudaEventCreate(&stop);
				cudaEventRecord(start, 0);
				{
					//统计GPU耗时的代码段
					productArray_bt(d_a, d_b, d_c, N, threadNum);
				}
				cudaEventRecord(stop, 0);
				cudaEventSynchronize(stop);
				float costtime;
				cudaEventElapsedTime(&costtime, start, stop);

				std::cout << "数组长度=" << N << ";\t" << "treadNum=" << threadNum << ";\t" << "点积用时:" << costtime / 1000 << "s" << std::endl;



				// Copy result back to host
				cudaMemcpy(pResult, d_c, size, cudaMemcpyDeviceToHost);


				//验证结果的正确性
				for (int i = 1; i < N; i *= 2) {
					//std::cout << "pa[i]=" << pa[i] << std::endl;
					if (pResult[i] != pa[i] * pb[i])
						std::cout << "错误: " << "i=" << i << ";\ti*10i=" << pResult[i] << std::endl;

				}


			}
			catch (std::string s){
				std::cout << "异常:" << s << std::endl;
				std::cout << "\t" << "数组长度=" << N << ";\t" << "treadNum=" << threadNum << ";\t" << std::endl;

			}
			catch (...){
				std::cout << "未知的异常类型" << std::endl;
				std::cout << "\t\t" << "数组长度=" << N << ";\t" << "treadNum=" << threadNum << ";\t" << std::endl;
			}


			std::cout << std::endl;

		}

		// Cleanup
		cudaFree(d_a);
		cudaFree(d_b);
		cudaFree(d_c);

		delete[]pa;
		delete[]pb;
		delete[]pResult;
	}

}





#define printExp(x) std::cout<< #x <<" = "<< x <<std::endl;

int main(void) {
	std::cout << __FILE__ << std::endl;

	TestProductSpeed();
	return 0;
}




程序输出如下:

***/testThreadSpeed.cu


**************数组长度为  1  的测试
数组长度=1;	treadNum=1;	点积用时:3.5904e-005s

数组长度=1;	treadNum=4;	点积用时:0.000135648s

数组长度=1;	treadNum=16;	点积用时:3.4592e-005s

数组长度=1;	treadNum=64;	点积用时:3.2384e-005s

数组长度=1;	treadNum=256;	点积用时:3.2928e-005s

数组长度=1;	treadNum=1024;	点积用时:3.1296e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=1;	treadNum=4096;	



**************数组长度为  2  的测试
数组长度=2;	treadNum=1;	点积用时:3.6448e-005s

数组长度=2;	treadNum=4;	点积用时:3.3696e-005s

数组长度=2;	treadNum=16;	点积用时:3.4368e-005s

数组长度=2;	treadNum=64;	点积用时:2.9024e-005s

数组长度=2;	treadNum=256;	点积用时:3.232e-005s

数组长度=2;	treadNum=1024;	点积用时:3.2352e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=2;	treadNum=4096;	



**************数组长度为  4  的测试
数组长度=4;	treadNum=1;	点积用时:3.6448e-005s

数组长度=4;	treadNum=4;	点积用时:4.3488e-005s

数组长度=4;	treadNum=16;	点积用时:3.248e-005s

数组长度=4;	treadNum=64;	点积用时:3.3984e-005s

数组长度=4;	treadNum=256;	点积用时:4.1952e-005s

数组长度=4;	treadNum=1024;	点积用时:3.3632e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=4;	treadNum=4096;	



**************数组长度为  8  的测试
数组长度=8;	treadNum=1;	点积用时:3.328e-005s

数组长度=8;	treadNum=4;	点积用时:3.36e-005s

数组长度=8;	treadNum=16;	点积用时:3.2032e-005s

数组长度=8;	treadNum=64;	点积用时:3.2736e-005s

数组长度=8;	treadNum=256;	点积用时:3.2416e-005s

数组长度=8;	treadNum=1024;	点积用时:3.3376e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=8;	treadNum=4096;	



**************数组长度为  16  的测试
数组长度=16;	treadNum=1;	点积用时:3.472e-005s

数组长度=16;	treadNum=4;	点积用时:3.2224e-005s

数组长度=16;	treadNum=16;	点积用时:3.2352e-005s

数组长度=16;	treadNum=64;	点积用时:3.28e-005s

数组长度=16;	treadNum=256;	点积用时:3.1648e-005s

数组长度=16;	treadNum=1024;	点积用时:3.2672e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=16;	treadNum=4096;	



**************数组长度为  32  的测试
数组长度=32;	treadNum=1;	点积用时:3.44e-005s

数组长度=32;	treadNum=4;	点积用时:3.3472e-005s

数组长度=32;	treadNum=16;	点积用时:3.1968e-005s

数组长度=32;	treadNum=64;	点积用时:4.8256e-005s

数组长度=32;	treadNum=256;	点积用时:3.4592e-005s

数组长度=32;	treadNum=1024;	点积用时:3.3152e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=32;	treadNum=4096;	



**************数组长度为  64  的测试
数组长度=64;	treadNum=1;	点积用时:3.5712e-005s

数组长度=64;	treadNum=4;	点积用时:3.12e-005s

数组长度=64;	treadNum=16;	点积用时:3.2352e-005s

数组长度=64;	treadNum=64;	点积用时:3.1168e-005s

数组长度=64;	treadNum=256;	点积用时:3.2064e-005s

数组长度=64;	treadNum=1024;	点积用时:3.3376e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=64;	treadNum=4096;	



**************数组长度为  128  的测试
数组长度=128;	treadNum=1;	点积用时:3.504e-005s

数组长度=128;	treadNum=4;	点积用时:3.2544e-005s

数组长度=128;	treadNum=16;	点积用时:3.1776e-005s

数组长度=128;	treadNum=64;	点积用时:3.1744e-005s

数组长度=128;	treadNum=256;	点积用时:3.1776e-005s

数组长度=128;	treadNum=1024;	点积用时:3.1872e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=128;	treadNum=4096;	



**************数组长度为  256  的测试
数组长度=256;	treadNum=1;	点积用时:3.5328e-005s

数组长度=256;	treadNum=4;	点积用时:3.3408e-005s

数组长度=256;	treadNum=16;	点积用时:3.456e-005s

数组长度=256;	treadNum=64;	点积用时:3.3952e-005s

数组长度=256;	treadNum=256;	点积用时:4.6336e-005s

数组长度=256;	treadNum=1024;	点积用时:3.1776e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=256;	treadNum=4096;	



**************数组长度为  512  的测试
数组长度=512;	treadNum=1;	点积用时:3.68e-005s

数组长度=512;	treadNum=4;	点积用时:3.2064e-005s

数组长度=512;	treadNum=16;	点积用时:3.2512e-005s

数组长度=512;	treadNum=64;	点积用时:3.2736e-005s

数组长度=512;	treadNum=256;	点积用时:3.136e-005s

数组长度=512;	treadNum=1024;	点积用时:3.2128e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=512;	treadNum=4096;	



**************数组长度为  1024  的测试
数组长度=1024;	treadNum=1;	点积用时:3.9552e-005s

数组长度=1024;	treadNum=4;	点积用时:3.3568e-005s

数组长度=1024;	treadNum=16;	点积用时:3.1712e-005s

数组长度=1024;	treadNum=64;	点积用时:3.184e-005s

数组长度=1024;	treadNum=256;	点积用时:3.5264e-005s

数组长度=1024;	treadNum=1024;	点积用时:3.2544e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=1024;	treadNum=4096;	



**************数组长度为  2048  的测试
数组长度=2048;	treadNum=1;	点积用时:4.7872e-005s

数组长度=2048;	treadNum=4;	点积用时:3.4368e-005s

数组长度=2048;	treadNum=16;	点积用时:3.2544e-005s

数组长度=2048;	treadNum=64;	点积用时:5.648e-005s

数组长度=2048;	treadNum=256;	点积用时:3.4336e-005s

数组长度=2048;	treadNum=1024;	点积用时:3.5296e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=2048;	treadNum=4096;	



**************数组长度为  4096  的测试
数组长度=4096;	treadNum=1;	点积用时:6.0384e-005s

数组长度=4096;	treadNum=4;	点积用时:3.872e-005s

数组长度=4096;	treadNum=16;	点积用时:3.328e-005s

数组长度=4096;	treadNum=64;	点积用时:3.3344e-005s

数组长度=4096;	treadNum=256;	点积用时:3.2832e-005s

数组长度=4096;	treadNum=1024;	点积用时:3.3088e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=1;	threadNum=4096;	
	数组长度=4096;	treadNum=4096;	



**************数组长度为  8192  的测试
数组长度=8192;	treadNum=1;	点积用时:8.7168e-005s

数组长度=8192;	treadNum=4;	点积用时:4.5664e-005s

数组长度=8192;	treadNum=16;	点积用时:3.504e-005s

数组长度=8192;	treadNum=64;	点积用时:3.2928e-005s

数组长度=8192;	treadNum=256;	点积用时:3.2096e-005s

数组长度=8192;	treadNum=1024;	点积用时:3.2128e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=2;	threadNum=4096;	
	数组长度=8192;	treadNum=4096;	



**************数组长度为  16384  的测试
数组长度=16384;	treadNum=1;	点积用时:0.000143616s

数组长度=16384;	treadNum=4;	点积用时:6.08e-005s

数组长度=16384;	treadNum=16;	点积用时:4.4512e-005s

数组长度=16384;	treadNum=64;	点积用时:3.7184e-005s

数组长度=16384;	treadNum=256;	点积用时:3.3088e-005s

数组长度=16384;	treadNum=1024;	点积用时:3.2736e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=4;	threadNum=4096;	
	数组长度=16384;	treadNum=4096;	



**************数组长度为  32768  的测试
数组长度=32768;	treadNum=1;	点积用时:0.000344064s

数组长度=32768;	treadNum=4;	点积用时:8.608e-005s

数组长度=32768;	treadNum=16;	点积用时:4.4608e-005s

数组长度=32768;	treadNum=64;	点积用时:3.568e-005s

数组长度=32768;	treadNum=256;	点积用时:3.248e-005s

数组长度=32768;	treadNum=1024;	点积用时:3.5552e-005s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=8;	threadNum=4096;	
	数组长度=32768;	treadNum=4096;	



**************数组长度为  65536  的测试
异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=65536;	threadNum=1;	
	数组长度=65536;	treadNum=1;	

数组长度=65536;	treadNum=4;	点积用时:0.000200448s

数组长度=65536;	treadNum=16;	点积用时:0.000135808s

数组长度=65536;	treadNum=64;	点积用时:0.00033584s

数组长度=65536;	treadNum=256;	点积用时:0.0003568s

数组长度=65536;	treadNum=1024;	点积用时:0.000324992s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=16;	threadNum=4096;	
	数组长度=65536;	treadNum=4096;	



**************数组长度为  131072  的测试
异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=131072;	threadNum=1;	
	数组长度=131072;	treadNum=1;	

数组长度=131072;	treadNum=4;	点积用时:0.00029168s

数组长度=131072;	treadNum=16;	点积用时:0.00015808s

数组长度=131072;	treadNum=64;	点积用时:0.000143424s

数组长度=131072;	treadNum=256;	点积用时:4.2816e-005s

数组长度=131072;	treadNum=1024;	点积用时:0.000152416s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=32;	threadNum=4096;	
	数组长度=131072;	treadNum=4096;	



**************数组长度为  262144  的测试
异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=262144;	threadNum=1;	
	数组长度=262144;	treadNum=1;	

异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=65536;	threadNum=4;	
	数组长度=262144;	treadNum=4;	

数组长度=262144;	treadNum=16;	点积用时:0.000238848s

数组长度=262144;	treadNum=64;	点积用时:0.000137728s

数组长度=262144;	treadNum=256;	点积用时:0.000148288s

数组长度=262144;	treadNum=1024;	点积用时:0.000140192s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=64;	threadNum=4096;	
	数组长度=262144;	treadNum=4096;	



**************数组长度为  524288  的测试
异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=524288;	threadNum=1;	
	数组长度=524288;	treadNum=1;	

异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=131072;	threadNum=4;	
	数组长度=524288;	treadNum=4;	

数组长度=524288;	treadNum=16;	点积用时:0.000356736s

数组长度=524288;	treadNum=64;	点积用时:0.00019056s

数组长度=524288;	treadNum=256;	点积用时:0.000161248s

数组长度=524288;	treadNum=1024;	点积用时:0.000157632s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=128;	threadNum=4096;	
	数组长度=524288;	treadNum=4096;	



**************数组长度为  1048576  的测试
异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=1048576;	threadNum=1;	
	数组长度=1048576;	treadNum=1;	

异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=262144;	threadNum=4;	
	数组长度=1048576;	treadNum=4;	

异常:productArray_bt_kernel launch failed: invalid argument
	blockNum=65536;	threadNum=16;	
	数组长度=1048576;	treadNum=16;	

数组长度=1048576;	treadNum=64;	点积用时:0.000241312s

数组长度=1048576;	treadNum=256;	点积用时:0.000206912s

数组长度=1048576;	treadNum=1024;	点积用时:0.000214688s

异常:productArray_bt_kernel launch failed: invalid configuration argument
	blockNum=256;	threadNum=4096;	
	数组长度=1048576;	treadNum=4096;	


分享到:
评论

相关推荐

    cuda 环境下的归一化程序

    2. **线程块与网格**:CUDA的并行计算是基于线程块(Thread Block)和网格(Grid)的结构。理解和利用这种并行模型是实现高效归一化的关键。线程块内的线程可以进行同步操作,而线程块之间则通过网格进行协调。 3. ...

    cuda实现的中值滤波介绍

    CUDA是一个由NVIDIA推出的并行计算平台和编程模型,它允许开发者使用C语言来编写能够在GPU上执行的程序。基于CUDA的程序能够利用GPU的并行处理单元,执行大规模的并行计算任务。由于GPU拥有成百上千个核心,其并行...

    cuda 入门资料。

    CUDA的线程层次结构包括线程块(Thread Block)、线程网格(Grid)和线程(Thread)。线程块是由多个线程组成的执行单元,线程块在GPU上并行执行。多个线程块组成一个线程网格,可以看作是线程块的集合,线程网格...

    风辰翻译Cuda3.0 Programming Guide

    CUDA的核心概念包括内核(kernel)、线程(thread)、块(block)和网格(grid)等。 ##### 1.3 一种可扩展的编程模型 CUDA编程模型是高度可扩展的,能够支持从小规模嵌入式系统到大规模超级计算机的各种应用场景。该模型...

    cuda-使用cuda并行加速实现之reduction.zip

    1. **数据并行性**:CUDA的并行性体现在线程块(Thread Block)和线程网格(Grid)的概念。每个线程块包含多个线程,它们可以并行执行,而多个线程块组成一个网格,可以在GPU的不同流处理器(Streaming ...

    cuda-使用cuda并行加速实现之UpsampleNearest2D.zip

    3. **配置线程块和网格**:CUDA程序中的计算由线程块(thread block)组成,线程块又构成网格(grid)。根据输入图像的大小,我们需要合理配置线程块的尺寸和数量,以确保高效利用GPU资源。通常,线程块的大小应该...

    GPU高性能运算之CUDA源代码

    CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种并行计算平台和编程模型,它允许开发者利用图形处理单元(GPU)进行高性能计算。在本文中,我们将深入探讨CUDA的源代码编写,理解其核心概念,并...

    CUDA GPU编程指南4.0

    CUDA 4.0支持与OpenGL和Direct3D等图形API的互操作,使得开发者能够在同一个程序中同时使用GPU进行计算和渲染任务。 #### 十三、驱动API 驱动API提供了对GPU更底层的访问,包括上下文管理、模块加载、内核执行等...

    CUDA_Math_API-v6.5 August 2014.pdf

    在使用CUDA Math API时,开发者需要了解如何将这些函数与CUDA的并行编程模型相结合,比如使用CUDA的线程块(thread block)和网格(grid)结构来并行计算多个数据点。同时,还需要注意浮点精度的选择,以及可能存在...

    CUDA参考手册

    ### CUDA参考手册知识点详解 #### 一、概述 CUDA(Compute Unified Device Architecture)是由NVIDIA公司提出的一种并行计算平台及编程模型。它允许开发者利用NVIDIA GPU的强大处理能力进行高性能计算。本手册旨在...

    CUDA编程指南

    CUDA软件栈包括了运行时库、驱动程序、工具和APIs,这些组件共同协作以支持CUDA程序的编译、执行和调试。 **2.5 计算能力** 计算能力是指GPU硬件支持的特定功能集。不同的计算能力版本对应不同的硬件特征和支持的...

    Image_Convolution_CUDA:通过使用共享和恒定内存在CUDA中进行2D图像卷积

    1. **线程块和网格结构**:CUDA的执行模型基于线程块(Thread Block)和线程网格(Grid)。线程块是一组同步执行的线程,而线程网格是由多个线程块组成的。在2D图像卷积中,通常会将线程块映射到图像的局部区域,以...

    alg_eng_matrix-master_matrix_源码

    1. **CUDA线程**:CUDA中的计算是通过线程执行的,这些线程被组织成多级结构——线程块(thread block)和网格(grid)。线程块内的线程可以高效地同步和共享数据,而网格则包含多个线程块,用于执行更大的任务。 2...

    基于CUDA的改进互信息并行计算方法

    在CUDA中,线程层次模型包括了多个层面:块(block)、网格(grid)以及线程(thread)。这些结构为开发者提供了灵活的并行控制机制。 互信息是一种用于度量两个随机变量X和Y之间相互依赖性的量,其定义为: \[ I...

    基于GPU的可见光与红外图像融合快速实现与应用.pdf

    1. **图像增强的CUDA实现**:在CUDA设计中,图像增强通常分为三个步骤:直方图统计、对应表生成和灰度值转换。首先,将图像划分为多个分块,利用block进行并行的灰度直方图统计,然后累加各个block的结果。接着,...

    cub

    6. **线程块级别的并行算法(Thread-Block-Level Parallel Algorithms)**:CUB提供了一些针对CUDA线程块内的并行算法,如线性搜索、排序等,这些在处理局部数据时特别有效。 7. **动态内存管理(Dynamic Memory ...

    GpuHex:使用十六进制游戏进行gpu树搜索的实验

    CUDA的核心概念包括设备(device)、上下文(context)、线程块(thread block)、网格(grid)以及共享内存等,这些都为高效利用GPU的并行性提供了基础。 在GpuHex的实现中,可能会有以下几个关键步骤: 1. **...

Global site tag (gtag.js) - Google Analytics