C++ 为什么这个类成员变量在调用CUDA内核函数时不改变?
在一个简单的测试CUDA应用程序中,我有一个指向类实例列表的指针,并将该数据复制到GPU。然后我多次运行内核函数。然后,内核函数为每个类实例调用一个C++ 为什么这个类成员变量在调用CUDA内核函数时不改变?,c++,c++11,cuda,C++,C++11,Cuda,在一个简单的测试CUDA应用程序中,我有一个指向类实例列表的指针,并将该数据复制到GPU。然后我多次运行内核函数。然后,内核函数为每个类实例调用一个\uuuu设备成员函数,该函数增加一个变量profitLoss 由于某些原因,profitLoss没有递增。以下是我的代码: #include <stdio.h> #include <stdlib.h> #define N 200000 class Strategy { private: doubl
\uuuu设备
成员函数,该函数增加一个变量profitLoss
由于某些原因,profitLoss
没有递增。以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define N 200000
class Strategy {
private:
double profitLoss;
public:
__device__ __host__ Strategy() {
this->profitLoss = 0;
}
__device__ __host__ void backtest() {
this->profitLoss++;
}
__device__ __host__ double getProfitLoss() {
return this->profitLoss;
}
};
__global__ void backtestStrategies(Strategy *strategies) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < N) {
strategies[i].backtest();
}
}
int main() {
int threadsPerBlock = 1024;
int blockCount = 32;
Strategy *devStrategies;
Strategy *strategies = (Strategy*)malloc(N * sizeof(Strategy));
int i = 0;
// Allocate memory for strategies on the GPU.
cudaMalloc((void**)&devStrategies, N * sizeof(Strategy));
// Initialize strategies on host.
for (i=0; i<N; i++) {
strategies[i] = Strategy();
}
// Copy strategies from host to GPU.
cudaMemcpy(devStrategies, strategies, N * sizeof(Strategy), cudaMemcpyHostToDevice);
for (i=0; i<363598; i++) {
backtestStrategies<<<blockCount, threadsPerBlock>>>(devStrategies);
}
// Copy strategies from the GPU.
cudaMemcpy(strategies, devStrategies, N * sizeof(Strategy), cudaMemcpyDeviceToHost);
// Display results.
for (i=0; i<N; i++) {
printf("%f\n", strategies[i].getProfitLoss());
}
// Free memory for the strategies on the GPU.
cudaFree(devStrategies);
return 0;
}
我希望是:
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
...
我相信profitLoss
不会因为我初始化对象的方式(自动存储持续时间)而增加,我也不确定是否有更好的方式来实例化这些对象并cudaMemcpy
将它们转移到GPU:
strategies[i] = Strategy();
有人能就如何解决这个问题或原因提供一些建议吗?提前谢谢你
更新对于前32768个输出行,似乎有数据,然后,每一行都是零。因此,我可能遇到了某种限制。根据您的网格dim
blockCount
和block dimthreadsPerBlock
设置,您只启动32x1024个线程,每个线程只更新一个实例。这就是为什么在向量的开头只有32768个非零结果
为了获得预期的结果,您可以通过增加网格dimblockCount
来增加GPU线程的数量,使其足以覆盖所有N
元素,或者
您可以在内核函数中使用for循环,让每个GPU线程更新几个元素,直到所有元素都更新为止
第二种方式是首选的,因为它具有更少的块启动开销。但您可能仍然需要大于32的网格dim来充分利用您的GPU。你可以在这里找到更多细节
根据网格dim
blockCount
和块dimthreadsPerBlock
设置,您只启动32x1024个线程,每个线程只更新一个实例。这就是为什么在向量的开头只有32768个非零结果
为了获得预期的结果,您可以通过增加网格dimblockCount
来增加GPU线程的数量,使其足以覆盖所有N
元素,或者
您可以在内核函数中使用for循环,让每个GPU线程更新几个元素,直到所有元素都更新为止
第二种方式是首选的,因为它具有更少的块启动开销。但您可能仍然需要大于32的网格dim来充分利用您的GPU。你可以在这里找到更多细节
以前从未见过cuda代码,请原谅我的无知。从0到363598的for循环应该做什么?但是它看起来像是正在执行
backtestStrategies
blockCount*threadsPerBlock
次:32*1024,类似于您看到的32768行输出。从0到363598的for循环表示通过363598历史数据记录的循环。谢谢你的洞察力!以前从未见过cuda代码,请原谅我的无知。从0到363598的for循环应该做什么?但是它看起来像是正在执行backtestStrategies
blockCount*threadsPerBlock
次:32*1024,类似于您看到的32768行输出。从0到363598的for循环表示通过363598历史数据记录的循环。谢谢你的洞察力!
strategies[i] = Strategy();