【发布时间】:2016-02-24 13:05:15
【问题描述】:
我想在设备上创建一个对象并将其分配给主机上可用的指针。我在这里做错了什么吗?
__global__ void createAProduction(DeviceProduction* production) {
production = new AProduction();
}
DeviceProduction * devAProduction = NULL;
cudaMalloc(&devAProduction, sizeof(AProduction));
createAProduction<<<1, 1>>>(devAProduction);
deviceProductions["A"] = devAProduction;
在代码中的某个地方我想做某事。喜欢:
BatchOperation ** devBatchOperations;
cudaMalloc((void **) &devBatchOperations, sizeof(BatchOperation *) * operationCount);
然后我用那个填充那个指针数组:
void DeviceBatchExecutor::execute(vector<BatchOperation> operationsToPerform) {
BatchOperation ** devBatchOperations;
cudaMalloc((void **) &devBatchOperations, sizeof(BatchOperation *) * operationsToPerform.size());
int i = 0;
for(batchOperationIt it = operationsToPerform.begin(); it != operationsToPerform.end(); ++it) {
BatchOperation * devBatchOperation;
cudaMalloc(&devBatchOperation, sizeof(BatchOperation));
cudaMemcpy(&devBatchOperation, &it, sizeof(BatchOperation), cudaMemcpyHostToDevice);
Vertex * devInputNode = it->inputNode->allocateToDevice();
cudaMemcpy(&(devBatchOperation->inputNode), &devInputNode, sizeof(Vertex *), cudaMemcpyDeviceToDevice);
cudaMemcpy(&(devBatchOperation->production), &(it->production), sizeof(Production *), cudaMemcpyDeviceToDevice);
cudaMemcpy(&devBatchOperations[i], &devBatchOperation, sizeof(BatchOperation *), cudaMemcpyDeviceToDevice);
i++;
}
int operationCount = operationsToPerform.size();
executeOperations<<<operationCount, 1>>>(devBatchOperations);
}
其中 production 是指向保存创建对象 AProduction 的设备内存的指针。然后我终于通过
调用处理executeOperations<<<operationCount, 1>>>(devBatchOperations);
所以我依赖于虚拟方法调用。由于这些 DeviceProduction 对象是在设备上创建的,因此还有一个虚拟指针表,因此它应该可以工作。请参阅示例here。但它不是,因为收到的批处理操作似乎是随机的......调用时崩溃。
__global__ void executeOperations(BatchOperation ** operation) {
operation[blockIdx.x]->production->apply(operation[blockIdx.x]->inputNode);
}
批处理操作是一个包含要执行的生产的结构。
struct BatchOperation {
Production * production;
Vertex * inputNode;
Vertex * outputNode;
};
【问题讨论】: