要有效利用CUDA核心,可以从以下几个方面入手:
以下是一个简单的CUDA核函数示例,用于计算数组中所有元素的和:
__global__ void sumArray(int *input, int *output, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
atomicAdd(output, input[idx]);
}
}
int main() {
int n = 1024 * 1024; // 数组大小
int *h_input, *h_output;
int *d_input, *d_output;
// 分配主机内存
h_input = (int *)malloc(n * sizeof(int));
h_output = (int *)malloc(sizeof(int));
// 初始化输入数据
for (int i = 0; i < n; ++i) {
h_input[i] = rand() % 100;
}
// 分配设备内存
cudaMalloc(&d_input, n * sizeof(int));
cudaMalloc(&d_output, sizeof(int));
// 将数据从主机复制到设备
cudaMemcpy(d_input, h_input, n * sizeof(int), cudaMemcpyHostToDevice);
// 调用核函数
int threadsPerBlock = 256;
int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;
sumArray<<>>(d_input, d_output, n);
// 等待GPU完成计算
cudaDeviceSynchronize();
// 将结果从设备复制回主机
cudaMemcpy(h_output, d_output, sizeof(int), cudaMemcpyDeviceToHost);
printf("Sum: %d\n", *h_output);
// 释放内存
cudaFree(d_input);
cudaFree(d_output);
free(h_input);
free(h_output);
return 0;
}
__syncthreads()
)以避免数据竞争。通过以上方法和实践,你可以更有效地利用CUDA核心来加速计算密集型任务。