2013-05-22 44 views
1

我一直在努力与此类实现相当长一段时间,并希望有人可以帮助我。CUDA类与多维指针

class Material_Properties_Class_device 
{ 

public: 
int max_variables; 
Logical * table_prop; 
Table_Class ** prop_table; 
}; 

实施为指针看起来像这样

Material_Properties_Class **d_material_prop = new Material_Properties_Class* [4]; 
Logical *table_prop; 

for (int k = 1; k <= 3; k++) 
{ 
cutilSafeCall(cudaMalloc((void**)&(d_material_prop[k]),sizeof(Material_Properties_Class))); 
cutilSafeCall(cudaMemcpy(d_material_prop[k], material_prop[k], sizeof(Material_Properties_Class), cudaMemcpyHostToDevice)); 
} 

for(int i = 1; i <= 3; i++) 
{ 
cutilSafeCall(cudaMalloc((void**)&(table_prop), sizeof(Logical))); 
cudaMemcpy(&(d_material_prop[i]->table_prop), &(table_prop), sizeof(Logical*),cudaMemcpyHostToDevice); 
cudaMemcpy(table_prop, material_prop[i]->table_prop, sizeof(Logical),cudaMemcpyHostToDevice); 
} 

cutilSafeCall(cudaMalloc((void ***)&material_prop_device, (4) * sizeof(Material_Properties_Class *))); 
cutilSafeCall(cudaMemcpy(material_prop_device, d_material_prop, (4) * sizeof(Material_Properties_Class *), cudaMemcpyHostToDevice)); 

此实现的作品,但它无法得到它的工作为** prop_table。 我认为它必须遵循相同的原则,但我无法绕开它。

我已经尝试

Table_Class_device **prop_table = new Table_Class_device*[3]; 

并插入另一环,第二在for循环

for (int k = 1; k <= 3; k++) 
     { 
      cutilSafeCall(cudaMalloc((void**)&(prop_table[k]), sizeof(Table_Class))); 
      cutilSafeCall(cudaMemcpy(prop_table[k], material_prop[i]->prop_table[k], sizeof(Table_Class *), cudaMemcpyHostToDevice)); 
     } 

帮助将大大appriciated

回答

1

有些魔力。也许它会帮助

struct fading_coefficient 
{ 
    double* frequency_array; 
    double* temperature_array; 
    int frequency_size; 
    int temperature_size; 
    double** fading_coefficients; 
}; 

struct fading_coefficient* cuda_fading_coefficient; 
    double* frequency_array = NULL; 
    double* temperature_array = NULL; 
    double** fading_coefficients = NULL; 
    double** fading_coefficients1 = (double **)malloc(fading_coefficient->frequency_size * sizeof(double *)); 

    cudaMalloc((void**)&frequency_array,fading_coefficient->frequency_size *sizeof(double)); 
    cudaMemcpy(frequency_array, fading_coefficient->frequency_array, fading_coefficient->frequency_size *sizeof(double), cudaMemcpyHostToDevice); 
    free(fading_coefficient->frequency_array); 

    cudaMalloc((void**)&temperature_array,fading_coefficient->temperature_size *sizeof(double)); 
    cudaMemcpy(temperature_array, fading_coefficient->temperature_array, fading_coefficient->temperature_size *sizeof(double), cudaMemcpyHostToDevice); 
    free(fading_coefficient->temperature_array); 

    cudaMalloc((void***)&fading_coefficients,fading_coefficient->temperature_size *sizeof(double*)); 

    for (int i = 0; i < fading_coefficient->temperature_size; i++) 
    { 
     cudaMalloc((void**)&(fading_coefficients1[i]),fading_coefficient->frequency_size *sizeof(double)); 
     cudaMemcpy(fading_coefficients1[i], fading_coefficient->fading_coefficients[i], fading_coefficient->frequency_size *sizeof(double), cudaMemcpyHostToDevice); 
     free(fading_coefficient->fading_coefficients[i]); 
    } 
    cudaMemcpy(fading_coefficients, fading_coefficients1, fading_coefficient->temperature_size *sizeof(double*), cudaMemcpyHostToDevice); 

    fading_coefficient->frequency_array = frequency_array; 
    fading_coefficient->temperature_array = temperature_array; 
    fading_coefficient->fading_coefficients = fading_coefficients; 

    cudaMalloc((void**)&cuda_fading_coefficient,sizeof(struct fading_coefficient)); 
    cudaMemcpy(cuda_fading_coefficient, fading_coefficient, sizeof(struct fading_coefficient), cudaMemcpyHostToDevice); 
+0

谢谢,看起来很完美,会给它一个去吧 – ThatQuantDude

+0

嗨T_T我用一个包含一些数据的对象实现你的例子,但我没有得到它的工作,衰落系数没有包含任何数据;我仍然不明白。为什么你例如再次释放数据并将其从底部3行再次复制回来?在此先感谢 – ThatQuantDude

+0

我免费释放RAM内存(fading_coefficient-> fading_coefficients [i]);在fading_coefficient-> fading_coefficients = fading_coefficients;我将fading_coefficient-> fading_coefficients指针指向视频内存。 –

1

这个问题出现频繁。多维指针尤其具有挑战性。

如果可能,建议您将多维指针的使用(**)扁平化为一维指针的使用(*),正如您所见,即使这样做有些麻烦。

进一步描述了一维情况(*here。虽然你似乎已经明白了。

如果您确实想处理2维(**)的情况,请查看here

3维情况(***)的示例实现是here。 (“疯狂!”)

这样使用2维和3维非常困难。因此,建议扁平化。

+0

干杯,我知道这是一个痛苦的,但我不能将其压平,因为我有我的代码集成到它大量采用了这些结构的各种现有串行代码访问目的。如果我知道了,我会将结果发布到我的简单课程中。 – ThatQuantDude