【发布时间】:2015-12-07 06:14:21
【问题描述】:
我正在学习一些基本的 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]);
}
}
【问题讨论】:
-
您的代码没有任何问题,只是缺少proper cuda error checking。当我运行您的代码时,它会打印出 0 1 4 9 16 25 ... 所以我相信您的 CUDA 设置有问题,正确的 cuda 错误检查将有助于识别问题。您也可以使用
cuda-memcheck运行您的代码,这可能会让您了解问题所在。如果您使用的是受 CUDA 7 或 CUDA 7.5 支持的最新 GPU,则可以在内核中使用printf。 -
好的,谢谢!我的 Nsight 现在说找不到 CUDA 兼容设备,尽管我可以在 Mac OS X 10.10.2 的系统偏好设置中看到 CUDA。无论如何,这是另一个问题。感谢您指出错误检查部分。