#include <stdio.h>
#include <cuda_runtime.h>
int main() {
int deviceCount;
cudaGetDeviceCount(&deviceCount);
for (int device = 0; device < deviceCount; device++) {
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, device);
printf("Device %d: %s\n", device, prop.name);
printf("最大线程块数量: %d\n", prop.maxBlocksPerMultiProcessor);
printf("每个线程块的最大线程数量: %d\n", prop.maxThreadsPerBlock);
printf("每个线程块的维度限制: (%d, %d, %d)\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
printf("多处理器数量: %d\n", prop.multiprocessorCount);
printf("每个多处理器的最大线程数量: %d\n", prop.maxThreadsPerMultiProcessor);
printf("\n");
}
return 0;
}
Device 0: NVIDIA GeForce RTX 3080
最大线程块数量: 16
每个线程块的最大线程数量: 1024
每个线程块的维度限制: (1024, 1024, 64)
多处理器数量: 68
每个多处理器的最大线程数量: 2048
-
总线程能力: 总线程能力=多处理器数量×每个多处理器的最大线程数量总线程能力=多处理器数量×每个多处理器的最大线程数量。
假设:
- 多处理器数量:68
- 每个多处理器的最大线程数量:2048
- 最大线程块数量:16
- 每个线程块的最大线程数量:1024
如果尝试启动 100 个线程块,每个线程块有 1024 个线程:
- 总线程数 = 100 * 1024 = 102400
但是,由于 GPU 的总线程能力是 139264,可以并行处理这些线程。但是,如果尝试启动更多线程块或更大的线程块,可能会超出多处理器的处理能力,导致性能下降。
#include <iostream>
#include <cuda_runtime_api.h>
#include <stdio.h>
#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))
inline void HandleError(cudaError_t err, const char *file, int line) {
if (err != cudaSuccess) {
std::cerr << "CUDA error: " << cudaGetErrorString(err) << " in " << file << " at line " << line << std::endl;
exit(err);
}
}
__global__ void kernelFunction() {
int threadId = threadIdx.x; // 获取线程在块内的 ID
printf("Hello from thread %d in block %d\n", threadId, blockIdx.x);
}
int main() {
int numBlocks = 16; // 定义 16 个线程块
int threadsPerBlock = 1024; // 每个线程块 1024 个线程
// 启动内核
kernelFunction<<<numBlocks, threadsPerBlock>>>();
// 等待 GPU 完成
cudaDeviceSynchronize();
return 0;
}