gpt4 book ai didi

cuda - pycuda 似乎是不确定的

转载 作者:行者123 更新时间:2023-12-04 15:59:55 29 4
gpt4 key购买 nike

我对 cuda 有一个奇怪的问题,

在下面的片段中,

#include <stdio.h>

#define OUTPUT_SIZE 26

typedef $PRECISION REAL;

extern "C"
{
__global__ void test_coeff ( REAL* results )
{
int id = blockDim.x * blockIdx.x + threadIdx.x;

int out_index = OUTPUT_SIZE * id;
for (int i=0; i<OUTPUT_SIZE; i++)
{
results[out_index+i]=id;
printf("q");
}
}
}

当我编译并运行代码(通过 pycuda)时,它按预期工作。当我删除 printf 时,结果很奇怪 - 大多数数组都正确填充,但其中一些似乎完全随机。

这是完整的python代码:
import numpy as np
import string

#pycuda stuff
import pycuda.driver as drv
import pycuda.autoinit

from pycuda.compiler import SourceModule

class MC:

cudacodetemplate = """
#include <stdio.h>

#define OUTPUT_SIZE 26

typedef $PRECISION REAL;

extern "C"
{
__global__ void test_coeff ( REAL* results )
{
int id = blockDim.x * blockIdx.x + threadIdx.x;

int out_index = OUTPUT_SIZE * id;
for (int i=0; i<OUTPUT_SIZE; i++)
{
results[out_index+i]=id;
//printf("q");
}
}
}
"""

def __init__(self, size, prec = np.float32):
#800 meg should be enough . . .
drv.limit.MALLOC_HEAP_SIZE = 1024*1024*800

self.size = size
self.prec = prec
template = string.Template(MC.cudacodetemplate)
self.cudacode = template.substitute( PRECISION = 'float' if prec==np.float32 else 'double')

#self.module = pycuda.compiler.SourceModule(self.cudacode, no_extern_c=True, options=['--ptxas-options=-v'])
self.module = SourceModule(self.cudacode, no_extern_c=True)

def test(self, out_size):
#try to precalc the co-efficients for just the elements of the vector that changes
test = np.zeros( ( 128, out_size*(2**self.size) ), dtype=self.prec )
test2 = np.zeros( ( 128, out_size*(2**self.size) ), dtype=self.prec )

test_coeff = self.module.get_function ('test_coeff')
test_coeff( drv.Out(test), block=(2**self.size,1,1), grid=( 128, 1 ) )
test_coeff( drv.Out(test2), block=(2**self.size,1,1), grid=( 128, 1 ) )
error = (test-test2)
return error

if __name__ == '__main__':
p1 = MC ( 5, np.float64 )
err = p1.test(26)
print err.max()
print err.min()

基本上,使用内核中的 printf,错误为 0 - 没有它,它会打印一些随机错误(在我的机器上大约 2452(最大值)和 -2583(最小值))

我不知道为什么。

我使用 geforce 570 在 pycuda 2012.2(Windows 7 64 位)上运行 cuda 4.2。

谢谢。

最佳答案

这很可能是由于编译器优化造成的。您正在将一 block 内存 OUTPUT_SIZE 的长度设置为 id 的循环常数值。根据我的经验,编译器会将其优化为 memcpy 或 whathaveyou,除非循环中发生了其他事情——即你的 print 语句。此外,如果您不使用该内存块,编译器可能会优化整个循环。尝试调整优化级别,看看是否有不同的结果。

关于cuda - pycuda 似乎是不确定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768637/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com