0

私はCUDAにまったく慣れていません。デバイス上に 1 つのオブジェクトを作成し、別のスレッドからそのメンバーにアクセスしたいと考えています。nvcc -arch=sm_20 (Tesla M2090 上) を使用していますが、コードを実行すると、「unspecified launch failure」が発生します。これが私のコードです:

#include <stdio.h>
#include <string>

using namespace std;

#ifdef __CUDACC__
#define CUDA_CALLABLE __host__ __device__
#else
#define CUDA_CALLABLE
#endif

class SimpleClass {
public:
    int i;
    CUDA_CALLABLE SimpleClass(){i=1;};
    CUDA_CALLABLE ~SimpleClass(){};
};

__global__ void initkernel(SimpleClass *a){
    a = new SimpleClass();
}
__global__ void delkernel(SimpleClass *a){
    delete a;
}
__global__ void kernel(SimpleClass *a){
printf("%d\n", a->i);
}

int main() {
    SimpleClass *a;
    initkernel<<<1,1>>>(a);
    cudaThreadSynchronize();
    kernel<<<1,10>>>(a);
    cudaThreadSynchronize();
    delkernel<<<1,1>>>(a);
    cudaThreadSynchronize();

    cudaError_t error = cudaGetLastError();
    string lastError = cudaGetErrorString(error);
    printf("%s\n",lastError.c_str());
    return 0;
}
4

1 に答える 1

0

「a」はホストに格納されているポインタであるため、最初のカーネルコードで「不特定の起動失敗」が発生しますが、デバイス関数から値を指定する必要があります。デバイスにオブジェクトを割り当てたい場合は、最初にデバイスにポインタを割り当てる必要があり、デバイス(カーネル)コードからオブジェクトを読み書きできますが、二重間接参照が必要になるため注意してください。

コードは次のようになります(残りの関数も同様に変更する必要があります)。

__global__ void initkernel(SimpleClass** a){
    *a = new SimpleClass();
}

int main() {
    SimpleClass** a;
    cudaMalloc((void**)&a, sizeof(SimpleClass**));
    initkernel<<<1,1>>>(a);
    cudaThreadSynchronize();
}

PS:pQBはそれについて完全に正しいので、各カーネルコードの後に​​エラーチェックを実行して、エラーをできるだけ早く検出する必要があります(現在、コード内のエラーの正確な場所を見つけるために)

于 2013-03-22T22:30:25.233 に答える