我正在学习一些基本的CUDA编程。我正在尝试使用host_a[i] = i
初始化主机上的数组。该数组由N = 128个整数组成。我正在启动一个内核,每个块有1个块和128个线程,我希望在索引i
处对整数进行平方。
我的问题是:
如何知道内核是否启动?我可以在内核中使用printf
吗?
我程序的预期输出是以空格分隔的整数平方列表 -
1 4 9 16 ...
。
我的代码出了什么问题,因为它会输出1 2 3 4 5 ...
代码:
#include <iostream>
#include <numeric>
#include <stdlib.h>
#include <cuda.h>
const int N = 128;
__global__ void f(int *dev_a) {
unsigned int tid = threadIdx.x;
if(tid < N) {
dev_a[tid] = tid * tid;
}
}
int main(void) {
int host_a[N];
int *dev_a;
cudaMalloc((void**)&dev_a, N * sizeof(int));
for(int i = 0 ; i < N ; i++) {
host_a[i] = i;
}
cudaMemcpy(dev_a, host_a, N * sizeof(int), cudaMemcpyHostToDevice);
f<<<1, N>>>(dev_a);
cudaMemcpy(host_a, dev_a, N * sizeof(int), cudaMemcpyDeviceToHost);
for(int i = 0 ; i < N ; i++) {
printf("%d ", host_a[i]);
}
}
答案 0 :(得分:1)
我如何知道内核是否已启动?我可以在内核中使用printf吗?
您可以在任何计算能力2.0或更高版本的GPU上使用printf
设备代码(只要#include <stdio.h>
)。由于CUDA 7和CUDA 7.5仅支持这些类型的GPU,如果您使用的是CUDA 7或CUDA 7.5(已成功),则可以在设备代码中使用printf
。
我的代码出了什么问题?
如评论中所述,如果在正确设置的计算机上运行,则代码没有“错误”。为了解决您之前的问题“我如何才能知道内核是否已启动?”,我认为最好的方法是使用proper cuda error checking,除了告诉您内核是否启动之外还有很多好处。不。在这种情况下,它还可以提供有关您机器上的CUDA设置不正确的故障的线索。您还可以使用cuda-memcheck
运行CUDA代码作为快速测试,以确定是否发生任何运行时错误。