【发布时间】:2016-06-07 17:08:44
【问题描述】:
我有以下 CUDA 内核:
__global__ void optimizer_backtest(double *data, Strategy *strategies, int strategyCount, double investment, double profitability) {
// Use a grid-stride loop.
// Reference: https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < strategyCount;
i += blockDim.x * gridDim.x)
{
strategies[i].backtest(data, investment, profitability);
}
}
TL;DR 我想找到一种方法将data 存储在共享 (__shared__) 内存中。我不明白的是如何使用多个线程填充共享变量。
我见过像this one 这样的示例,其中data 被逐个线程复制到共享内存中(例如myblock[tid] = data[tid]),但我不确定在我的情况下如何执行此操作。问题是每个线程都需要访问整个“行”(展平)数据,每次迭代通过数据集(请参阅下文中调用内核的位置)。
我希望是这样的:
__global__ void optimizer_backtest(double *data, Strategy *strategies, int strategyCount, int propertyCount, double investment, double profitability) {
__shared__ double sharedData[propertyCount];
// Use a grid-stride loop.
// Reference: https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < strategyCount;
i += blockDim.x * gridDim.x)
{
strategies[i].backtest(sharedData, investment, profitability);
}
}
这里有更多详细信息(如果需要更多信息,请询问!):
strategies 是指向Strategy 对象列表的指针,data 是指向分配的扁平数据数组的指针。
在backtest() 中,我像这样访问数据:
data[0]
data[1]
data[2]
...
未展平,数据是一个固定大小的二维数组,类似这样:
[87.6, 85.4, 88.2, 86.1]
84.1, 86.5, 86.7, 85.9
86.7, 86.5, 86.2, 86.1
...]
至于内核调用,我对数据项进行了迭代,对n个数据行(约350万)调用了n次:
int dataCount = 3500000;
int propertyCount = 4;
for (i=0; i<dataCount; i++) {
unsigned int dataPointerOffset = i * propertyCount;
// Notice pointer arithmetic.
optimizer_backtest<<<32, 1024>>>(devData + dataPointerOffset, devStrategies, strategyCount, investment, profitability);
}
【问题讨论】:
-
为什么
sharedData是一个指针数组?完全不清楚您在这里要做什么 -
它不是一个指针数组。这相当于指向内存中数组的指针。正如我已经解释过的,它是一个像这样的扁平结构:
[87.6, 85.4, 88.2, 86.1, 84.1, 86.5, 86.7, 85.9, 86.7, 86.5, 86.2, 86.1, ...]。data[1]是85.4。这正是Strategy::backtest()使用data的方式:它通过索引访问项目。data初始化如下:double *data = (double*)malloc(dataPointCount * dataPropertyCount * sizeof(double));我不知道还有什么要解释的。 -
哦,我明白你在说什么。
sharedData应该是__shared__ double sharedData[propertyCount]。我会更新这个。谢谢你。请不要因为一个错字而投票结束我的问题。 -
您真的是说您不能编写代码来将 4 个双精度值加载到共享内存数组中吗? 究竟你这样做的问题是什么?我不会因为拼写错误而投票关闭它,我投票关闭它是因为它是一个模糊、广泛的帖子,有很多词,没有真正的具体问题。
-
有点不清楚你想用你的代码做什么,为什么你需要共享内存。如果你能稍微解释一下这些会有所帮助。共享内存通常用于跨线程交换数据。所以我猜你想对 3.5m 数据中的每一个应用 20k 策略并检查 20k x 3.5m 结果?如果是,那么使用共享内存听起来是个不错的情况。但是您需要比 4 个元素更大的共享内存,并且您可能还希望使用共享内存缓存策略。
标签: c++ cuda shared-memory