-1

Tesla C1060 (compute 1.3) でデータ構造をホストからコンスタント メモリに移動しようとしています。次の関数を使用します。

//mem.cu
#include "kernel.cuh"

int InitDCMem(SimuationStruct *sim)
{
  SimParamGPU h_simparam;

  h_simparam.na = sim->det.na;
  h_simparam.nz = sim->det.nz;
  h_simparam.nr = sim->det.nr;

  cudaMemcpyToSymbol(d_simparam, &h_simparam, sizeof(SimParamGPU));
}  

データ構造 (ヘッダー ファイル内):

//kernel.cuh

typedef struct __align__(16)
{
  int na;
  int nz;
  int nr;
} SimParamGPU;

__constant__ SimParamGPU d_simparam;

問題は、値が GPU の定数メモリにコピーされていないように見えることです。

cudaMemcpyToSymbol do not copy dataに記載されているように再宣言する必要があり__constant__ますか。どこか で使うべきですか?\\mem.cu
extern

エラーはなく、値は常に 0 に設定されます。

4

1 に答える 1

0

カーネルはどこにありますか? d_simparamコンパイラの観点から見ると、ホスト コードと同じ「変換単位」にあります。ここでは「extern」宣言は必要ありません。カーネルが存在するソース ファイルで必要になる場合があります。

これは私のために働くものです:

device.h - デバイス シンボルを含むファイル:

#include <stdio.h>

struct SimpleStruct {
    int a;
    float b;
};

__constant__ SimpleStruct variable = { 10, 0.3f };

__global__ void kernel() {
    printf("%d %f\n", variable.a, variable.b);
}

host.cu - ホスト コード:

#include <stdio.h>
#include <stdlib.h>

#define CUDA_CHECK_RETURN(value) {                                      \
    cudaError_t _m_cudaStat = value;                                    \
    if (_m_cudaStat != cudaSuccess) {                                   \
        fprintf(stderr, "Error %s at line %d in file %s\n",             \
                cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__);   \
    exit(1);                                                            \
} }

#include "device.h"

int main(void) {
    const SimpleStruct n = { 7, 0.5f };

    CUDA_CHECK_RETURN(cudaMemcpyToSymbol(variable, &n, sizeof(SimpleStruct)));

    kernel<<<1, 1>>>();

    CUDA_CHECK_RETURN(cudaThreadSynchronize()); // Wait for the GPU launched work to complete
    CUDA_CHECK_RETURN(cudaGetLastError());
    CUDA_CHECK_RETURN(cudaDeviceReset());

    return 0;
}

更新:個別のコンパイルは、SM 2.0 以降のデバイスでのみサポートされています。SM 1.3 コードに個別のコンパイルを使用することはできません。

于 2013-10-29T16:23:53.037 に答える