要練習用CUDA編碼,我做了一個小測試場景,我有三個文件:CUDA錯誤 - 未指定發射失敗
memory.c
舉行純C
代碼memory_kernels.h
聲明爲CUDA內核和功能推出仁仁memory_kernels.cu
定義
什麼程序應該做的是創造一個整數數組,將其複製到設備並查詢元素。內核將打印出一些細節。
不過,我得到的錯誤:
Error in memory_kernels.cu at line 43 with error code "unspecified launch failure"
三個文件的源代碼給出如下:
/**
* memory.c
*
* Test copying large arrays to device
* and printing from kernel
*/
/* Include standard libraries */
#include <stdlib.h>
#include <stdio.h>
/* Include local header files */
#include "memory_kernels.h"
int main() {
/* Size of array */
int i, N = 1024;
/* Array */
int *intArr = (int *) malloc(N * sizeof(int));
/* Fill array */
for(i = 0; i < N; i++) {
intArr[i] = i;
}
/* Run CUDA code */
cuda_mem(&intArr);
/* Clean up device */
cudaDeviceReset();
/* Everything done */
exit(EXIT_SUCCESS);
}
/**
* memory_kernels.h
*
* Declarations for CUDA kernels
*/
/* Determine compiler */
#ifdef __cplusplus
#define EXTCFUNC extern "C"
#else
#define EXTCFUNC extern
#endif
#ifndef KERNELS_H
#define KERNELS_H
/* Standard libraries (only needed for debugging) */
#include <stdio.h>
/* Include CUDA header files */
#include <cuda.h>
#include <cuda_runtime.h>
#define CUDA_CALL(x) do { if((x) != cudaSuccess) { \
printf("Error in %s at line %d with error code \"%s\"\n",__FILE__,__LINE__,cudaGetErrorString(x)); \
exit(x);}} while(0)
/* Device globals */
__device__ int *d_intArr;
/* Device kernels */
__global__ void mem();
/* Host access functions */
EXTCFUNC void cuda_mem(int **intArr);
#endif
/**
* memory_kernels.cu
*
* CUDA kernel implementations
*/
/* Include header file */
#include "memory_kernels.h"
__global__ void mem() {
int i = threadIdx.x;
int a = d_intArr[i];
printf("i = %d a = %d\n",i,a);
}
/* Determine compiler */
#ifdef __cplusplus
#define EXTCFUNC extern "C"
#else
#define EXTCFUNC extern
#endif
/**
* cuda_mem()
*
* Test copying large array to device
* and printing from kernel
*/
EXTCFUNC void cuda_mem(int **intArr) {
/* Local variables */
int N = 1024;
/* Initialise device variables */
CUDA_CALL(cudaMalloc((void **) &d_intArr, sizeof(int) * N));
/* Copy to device initial values */
CUDA_CALL(cudaMemcpy(d_intArr, *intArr, sizeof(int) * N, cudaMemcpyHostToDevice));
/* Run kernel */
mem <<< 1,N >>>();
CUDA_CALL(cudaPeekAtLastError());
CUDA_CALL(cudaDeviceSynchronize());
/* Free local scoped dynamically allocated memory */
CUDA_CALL(cudaFree(d_intArr));
}
編譯與done以下命令:
nvcc -c -o memory.o memory.c -arch=sm_20
nvcc -c -o memory_kernels.o memory_kernels.cu -arch=sm_20
nvcc -o memory memory.o memory_kernels.o -arch=sm_20
在NVIDIA®(英偉達™)Tesla M2050上運行CUDA 4.0。計算能力2.0需要在內核中使用printf()
。
在四處尋找解決方案後,錯誤代碼表明在從全局內存讀取時,內核中存在分段錯誤。但是,我正在啓動與數組大小相同的線程數。
經過實驗,我有一種感覺,錯誤是由於將intArr
複製到設備造成的。也許我正在把我的指針混淆起來?
我明白如果文件結構有點奇怪,但它是一個較大程序的一部分,但我已將錯誤減少到這個較小的情況。
.H持有聲明和.C持有的定義。 –
啊,是的,對不起。讓我編輯它。 – gobbledygook88
未指定的啓動錯誤通常意味着內核內存訪問超出界限。你有沒有試過用cuda-memcheck運行代碼? – talonmies