2017-07-03 15 views
-2

私はいくつかの冗長操作を含む長いコードをデバッグしています。 私は現在、cudaMemcpy(...,...,cudaMemcpyHostToDevice)への呼び出し中に上記のエラーが発生していますが、それはspeficiallyそれに関連しているか分からない。ここでチェックに失敗しました:エラー== cudaSuccess(77対0)不正なメモリアクセスが発生しました

は、コードスニペットです:

CUDA_CHECKは(これは既存のコードの一部であっただけで任意のCUDAのエラーを印刷するためのマクロであり、他のすべてのcudaMemcpyオーデルcudaMallocはそれがない呼び出すために正常に動作
int num_elements = 8294400; // --> I also tried it with "1" here which didn't work either! 
    float *checkArray = new float[num_elements]; 
    float *checkArray_GPU; 
    CUDA_CHECK(cudaMalloc(&checkArray_GPU, num_elements * sizeof(float))); 
    CUDA_CHECK(cudaMemcpy(checkArray_GPU, checkArray, num_elements * sizeof(float), cudaMemcpyHostToDevice)); 
    CUDA_CHECK(cudaMemcpy(checkArray, checkArray_GPU, num_elements * sizeof(float), cudaMemcpyDeviceToHost));  

問題の一部)。不思議なことに、このコードスニペットをおもちゃ*.cuの例で別々に実行しても問題ありません。

私の前提は、プログラムの以前のcuda操作のために、上のコードスニペットのバグの原因となるいくつかのエラーが報告されていることです。それはできますか? cudaに関連する報告されていないエラーがあるかどうかを確認する方法はありますか?

他の見積もりは、私が使用している特定のグラフィックカードから来ている可能性があります。私はNvidia Titan X Pascal、Cuda 8.0、cudnn v5.1を持っています。私はまたsome special compiler flagsを使ってコードをコンパイルしようとしました。

-arch=sm_30 \ 
-gencode=arch=compute_20,code=sm_20 \ 
-gencode=arch=compute_30,code=sm_30 \ 
-gencode=arch=compute_50,code=sm_50 \ 
-gencode=arch=compute_52,code=sm_52 \ 
-gencode=arch=compute_52,code=compute_52 \ 
-gencode=arch=compute_60,code=sm_60 \ 
-gencode=arch=compute_61,code=sm_61 \ 
-gencode=arch=compute_62,code=sm_62 \ 

しかしこれまでは助けになりませんでした。ここでは完全を期すために私の現在の簡略化のMakefileです:

NVCC = nvcc 
CUDA_INC = -I/usr/local/cuda/include 
CUDA_LIB = -L/usr/local/cuda/lib64 
TARGET = myProgramm 
OPTS = -std=c++11 
$(TARGET).so: $(TARGET).o 
    $(NVCC) $(OPTS) -shared $(TARGET).o $(CUDA_LIB) -o $(TARGET).so 
$(TARGET).o: $(TARGET).cu headers/some_header.hpp 
    $(NVCC) $(OPTS) $(CUDA_INC) -Xcompiler -fPIC -c $(TARGET).cu 

は、私がこれの底に得ることができるか、誰が考えていますか?

編集
CUDA-memcheckは良いアイデアだったので、エラーがapparantly Kernel_set_valueの通話中に、以前に発生します。

========= Invalid __global__ write of size 4 
=========  at 0x00000298 in void Kernel_set_value<float>(unsigned long, unsigned long, float*, float) 
=========  by thread (480,0,0) in block (30,0,0) 
=========  Address 0x0005cd00 is out of bounds 
=========  Saved host backtrace up to driver entry point at kernel launch time 
=========  Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 (cuLaunchKernel + 0x2c5) [0x209035] 
[...] 
=========  Host Frame:/media/.../myProgramm.so (_ZN5boost6python6detail6invokeIiPFvRKSsENS0_15arg_from_pythonIS4_EEEEP7_objectNS1_11invoke_tag_ILb1ELb0EEERKT_RT0_RT1_ + 0x2d) [0x3e5eb] 
[...] 
========= 
========= Program hit cudaErrorLaunchFailure (error 4) due to "unspecified launch failure" on CUDA API call to cudaMemcpy. 
=========  Saved host backtrace up to driver entry point at error 
=========  Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2f4e33] 
=========  Host Frame:/media/.../myProgramm.so [0x7489f] 
F0703 16:23:54.840698 26207 myProgramm.cu:411] Check failed: error == cudaSuccess (4 vs. 0) unspecified launch failure 
[...] 
=========  Host Frame:python (Py_Main + 0xb5e) [0x66d92] 
=========  Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf5) [0x21f45] 
=========  Host Frame:python [0x177c2e] 
========= 
*** Check failure stack trace: *** 
========= Error: process didn't terminate successfully 
========= Internal error (20) 
========= No CUDA-MEMCHECK results found 

だけでなく、玩具の例では正常に動作しKernel_set_value機能。 Kernel_set_valueを使用する際に特別な考慮事項がありますか?これはソースコードであり、それぞれのヘルパー関数です。

#define CUDA_NUM_THREADS 512 
#define MAX_NUM_BLOCKS 2880 

inline int CUDA_GET_BLOCKS(const size_t N) { 
    return min(MAX_NUM_BLOCKS, int((N + size_t(CUDA_NUM_THREADS) - 1)/CUDA_NUM_THREADS)); 
} 

inline size_t CUDA_GET_LOOPS(const size_t N) { 
    size_t total_threads = CUDA_GET_BLOCKS(N)*CUDA_NUM_THREADS; 
    return (N + total_threads -1)/ total_threads; 
} 

template <typename Dtype> 
__global__ void Kernel_set_value(size_t CUDA_NUM_LOOPS, size_t N, Dtype* GPUdst, Dtype value){ 
    const size_t idxBase = size_t(CUDA_NUM_LOOPS) * (size_t(CUDA_NUM_THREADS) * size_t(blockIdx.x) + size_t(threadIdx.x)); 
    if (idxBase >= N) return; 
    for (size_t idx = idxBase; idx < min(N,idxBase+CUDA_NUM_LOOPS); ++idx){ 
    GPUdst[idx] = value; 
    } 
} 
+0

​​は 'num_elements''に等しいnum_crop_voxels'です(missleadingた? – sgarizvi

+0

はい、私は – mcExchange

+2

がcudamemcheckでコードを実行することを編集します。 – talonmies

答えて

0

最後の解決策は、-gencode=arch=compute_XX,code=sm_XXスタイルフラグを使用せずにコードをコンパイルすることでした。これを見つけるために永遠に私を連れて行った。実際のエラーコードは非常にerror == cudaSuccess (77 vs. 0) an illegal memory access(4 vs. 0) unspecified launch failureまたは

+0

あなたはこの答えまで '無効なデバイスの機能 'について言及したことはありません。このエラーコードは、ほとんどの場合、間違ったアーキテクチャのコンパイルを示しています(すべてのアーキテクチャスイッチを削除すると、最も制限のない「sm_20」コンパイルがデフォルトになります)。しかし、あなたが言及している他のエラーコード( ''不正なメモリアクセス ''と ''不特定の起動失敗 '')は他の問題と関連しています。それらを一括してまとめ、アーチスイッチの選択をコンパイルすることによると示唆しているのは、単に間違っているだけです。 –

関連する問題