我需要总结100000存储在数组中的值,但有条件.
有没有办法在CUDA中做到这一点以产生快速结果?
任何人都可以发布一个小代码来做到这一点?
我的程序需要最大限度地使用 GPU。
那么,blockDim.x * blockIdx.x + threadIdx.x; 是吗?是否能够访问所有线程?或者也必须使用 .y 和 .z ?这是强制性的吗?
如果我使用
float sum = thrust::transform_reduce(d_a.begin(), d_a.end(), conditional_operator(), 0.f, thrust::plus<float>());
Run Code Online (Sandbox Code Playgroud)
我得到满足条件的所有元素的总和conditional_operator(),如在CUDA中的条件减少.
但我可以总结只有元素d_a[0],d_a[2],d_a[4],d_a[6],.....?
我想过改变条件运算符,但它可以处理数组中的元素而不需要引用索引.
我能做些什么?
我试过这个链接中的代码是CUDA固定内存零拷贝? 要求声称该程序对他来说工作得很好的人但是如果我在内核中操作它们,那么值不会改变我的值.
基本上我的问题是,我的GPU内存不够,但我想进行需要更多内存的计算.我的程序使用RAM内存或主机内存,并能够使用CUDA进行计算.链接中的程序似乎解决了我的问题,但代码不提供输出,如该人所示.
关于零复制存储器的任何帮助或任何工作示例都是有用的.
谢谢
__global__ void testPinnedMemory(double * mem)
{
double currentValue = mem[threadIdx.x];
printf("Thread id: %d, memory content: %f\n", threadIdx.x, currentValue);
mem[threadIdx.x] = currentValue+10;
}
void test()
{
const size_t THREADS = 8;
double * pinnedHostPtr;
cudaHostAlloc((void **)&pinnedHostPtr, THREADS, cudaHostAllocDefault);
//set memory values
for (size_t i = 0; i < THREADS; ++i)
pinnedHostPtr[i] = i;
//call kernel
dim3 threadsPerBlock(THREADS);
dim3 numBlocks(1);
testPinnedMemory<<< numBlocks, threadsPerBlock>>>(pinnedHostPtr);
//read output
printf("Data after kernel execution: ");
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud)